我有以下代码片段:
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给出的参数内容而不是面板函数.
有没有办法避免这个问题?如何使功能起作用?
据我所知,这不是因为嵌套...而是因为第一个...在条形图中.所以即使这不起作用:
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的参数.