簡體   English   中英

嵌套函數中的省略號擴展:錯誤“ ..3在錯誤的上下文中使用,沒有…可查看”

[英]Ellipsis expansion in nested functions: Error “..3 used in an incorrect context, no … to look in”

我有以下代碼片段:

require(lattice)
f.barchart <- function(...) {
    barchart(...,
        panel = function(x, y, ...) {
            panel.barchart(x, y, ...)
        }
    )
}

x <- data.frame(a = c(1,1,2,2), b = c(1,2,3,4), c = c(1,2,2,1))
f.barchart(a ~ b, data = x, groups = c)

這導致拋出以下錯誤:

..3 used in an incorrect context, no ... to look in

當我使用以下定義時:

f.barchart <- function(...) {
    substitute(barchart(...,
        panel = function(x, y, ...) {
            panel.barchart(x, y, ...)
        }
    ))
}

我得到:

barchart(a ~ b, data = x, groups = c,
    panel = function(x, y, ...) {
        panel.barchart(x, y, a ~ b, data = x, groups = c)
    })

我不確定這是否是導致上述錯誤的原因,但這意味着panel.barchart中的省略號會錯誤地擴展給f.barchart而不是panel函數的參數內容。

有辦法避免這個問題嗎? 如何使該功能起作用?

據我了解,發生這種情況並不是因為嵌套的……而是因為條形圖中的第一個……。 因此,即使這樣也不起作用:

f.barchart <- function(...) {
    barchart(...)
}

x <- data.frame(a = c(1,1,2,2), b = c(1,2,3,4), d = c(1,2,2,1))
print(f.barchart(a ~ b, data = x, groups = d))

我認為這是因為...是barchart期待單個參數時的配對列表。 我們需要解壓縮配對列表,同時確保不要過早評估它。 以下是我的解決方案:

f.barchart <- function(...) {
  cl<-match.call()
  cl$panel=function(x, y, ...) {
            panel.barchart(x, y, ...)
          }
  cl[[1]]=barchart
  eval(cl)
}

我們使用match.call捕獲對f.barchart的調用,該調用將擴展點,將面板參數添加到調用中,將要調用的函數設置為barchart,然后評估該調用。 正如我們添加面板參數一樣,我們可以刪除f.barchart使用但不需要傳遞給barchart的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM