嵌套函数中的省略号扩展:错误“..3在不正确的上下文中使用,没有......查看”

时间:2010-02-18 09:04:24

标签: r function syntax

我有以下代码段:

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而不是面板的参数的内容 功能

有没有办法避免这个问题?我该如何制作这个功能 工作?

1 个答案:

答案 0 :(得分:7)

据我了解,这不是因为嵌套...而是因为第一个...在条形图中。所以即使这不起作用:

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))

我认为这是因为...是一个pairlist,而条形图期待个人争论。我们需要拆开滑翔机,同时确保我们不会过早评估它。以下是我的解决方案:

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,然后评估调用。就像我们添加了panel参数一样,我们可以删除f.barchart使用但不需要传递给条形图的参数。