【问题标题】:Ellipsis expansion in nested functions: Error "..3 used in an incorrect context, no ... to look in"嵌套函数中的省略号扩展:错误“..3 在不正确的上下文中使用,没有 ... 要查看”
【发布时间】:2011-01-18 05:53:35
【问题描述】:

我有以下代码sn-p:

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

有没有办法避免这个问题?我怎样才能使功能 工作?

【问题讨论】:

  • 我会小心调用变量c,因为当您使用groups=c 时,它认为您指的是函数。然而,这不是你的问题的原因。我发现的唯一一点是,没有 group=c 参数,一切正常。

标签: r function syntax


【解决方案1】:

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

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 的参数。

【讨论】:

  • 非常感谢。我只需要做一个小的修改:似乎有必要使用 eval.parent 而不是 eval。我的函数现在看起来像这样: f.barchart
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2015-02-11
  • 2023-04-03
  • 1970-01-01
  • 2017-03-02
相关资源
最近更新 更多