如何让R识别省略号中的参数向量?

时间:2016-05-23 23:03:27

标签: r function plot arguments ellipsis

我试图巧妙地使用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'

所以这里出了点问题。如果我立即将省略号参数传递给绘图函数,它确实可以正常工作。

1 个答案:

答案 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;闭包时会收到错误消息。