我试图巧妙地使用R中的省略号(...
)参数并且遇到一些问题。
我试图在函数的开头传递一些默认参数,而不是使用...
来混淆函数的参数区域,并在那里提供它们。但不知何故,省略号的论证似乎并没有拿起我的完整载体
test <- function(dat,
# I don't want to have to put default col,
# ylim, ylab, lty arguments etc. here
...) {
# but here, to be overruled if hasArg finds it
color <- "red"
if(hasArg(col)) { # tried it with both "col" and col
message(paste("I have col:", col))
color <- col
}
plot(dat, col = color)
}
函数调用:
test(data.frame(x = 1:10, y = 11:20), col = c("purple", "green", "blue"))
引发错误:
Error in paste("I have col:", col) (from #8) :
cannot coerce type 'closure' to vector of type 'character'
所以这里出了点问题。如果我立即将省略号参数传递给绘图函数,它确实可以正常工作。
答案 0 :(得分:4)
如果你想在函数中使用它的内容,你需要通过收集/打包...
到列表来做到这一点。
test <- function(dat,
# I don't want to have to put default col,
# ylim, ylab, lty arguments etc. here
...) {
opt <- list(...)
color <- "red"
if(!is.null(opt$col)) { # tried it with both "col" and col
message(paste("I have col:", opt$col))
color <- opt$col
}
plot(dat, col = color)
}
test(data.frame(x = 1:10, y = 11:20), col = c("purple", "green", "blue"))
原始代码中的问题是args()
或hasArg()
仅适用于函数调用中的形式参数。因此,当您传递col = c("purple", "green", "blue")
时,hasArg()
知道存在正式参数col
,但不会对其进行评估。因此,在函数内部,没有找到实际的col
变量(您可以使用调试器来验证这一点)。有趣的是,R col()
包中有一个函数base
,因此该函数被传递给paste
。因此,在尝试连接字符串和&#34;闭包时会收到错误消息。