我有以下代码段:
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而不是面板的参数的内容 功能
有没有办法避免这个问题?我该如何制作这个功能 工作?
答案 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使用但不需要传递给条形图的参数。