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

lit*_*ith 3 syntax r function

我有以下代码片段:

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)
Run Code Online (Sandbox Code Playgroud)

这导致抛出以下错误:

..3 used in an incorrect context, no ... to look in
Run Code Online (Sandbox Code Playgroud)

当我使用以下定义时:

f.barchart <- function(...) {
    substitute(barchart(...,
        panel = function(x, y, ...) {
            panel.barchart(x, y, ...)
        }
    ))
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

barchart(a ~ b, data = x, groups = c,
    panel = function(x, y, ...) {
        panel.barchart(x, y, a ~ b, data = x, groups = c)
    })
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是上述错误的原因,但这意味着panel.barchart中的省略号会被错误地扩展为f.barchart给出的参数内容而不是面板函数.

有没有办法避免这个问题?如何使功能起作用?

Jyo*_*rya 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))
Run Code Online (Sandbox Code Playgroud)

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

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

我们使用match.call捕获对f.barchart的调用,match.call扩展点,将面板参数添加到调用,将函数设置为barchart,然后评估调用.就像我们添加了panel参数一样,我们可以删除f.barchart使用但不需要传递给barchart的参数.

  • 非常感谢.我不得不做一个小修改:似乎有必要使用eval.parent而不是eval.我的函数现在看起来像这样:f.barchart < - function(...){cl < - f.merge.list(as.list(match.call()),list(MYOPTIONS))cl [[1]] = barchart eval.parent(as.call(cl))}其中f.merge.list是:f.merge.list < - function(a,b){c(a,b [!names(b)%in%名称(a)])} (2认同)