将可选参数传递给函数,三个点

Pass optional arguments to function, three dots

我对 ... 的工作原理感到困惑。

tt = function(...) {
  return(x)
}

为什么 tt(x = 2) return 2

相反,它失败并显示错误:

Error in tt(x = 2) : object 'x' not found

即使我将 x 作为参数传递 ?

因为您在 ... 中传递的所有内容都保留在 ... 中。您传递的未被参数显式捕获的变量不会扩展到本地环境中。 ... 应该用于当前函数根本不需要交互的值,但是某些后续函数确实需要使用它们可以很容易地在 ... 中传递。它适用于

这样的场景
ss <- function(x) {
   x
}

tt <- function(...) {
  return(ss(...))
}

tt(x=2)

如果你的函数需要定义变量x,它应该是一个参数

tt <- function(x, ...) {
  return(x)
}

如果你真的想把点扩展到当前环境中(我强烈建议你不要这样做),你可以做类似

tt <- function(...) {
  list2env(list(...), environment())
  return(x)
}

如果您将三个点定义为您的函数的参数并希望它工作,您需要告诉您的函数这些点的实际位置。在您的示例中,您既没有将 x 定义为参数,也没有将 ... 功能定义在函数主体的其他位置。一个实际有效的例子是:

tt <- function(x, ...){
       mean(x, ...)
}

x <- c(1, 2, 3, NA)
tt(x)
#[1] NA
tt(x, na.rm = TRUE)
#[1] 2

此处 ... 指的是 函数 mean 可能采用的任何其他参数 。此外,您还有一个常规参数 x。在第一个示例中 tt(x) 只是 returns mean(x),而在第二个示例中 tt(x, na.rm = TRUE) 将第二个参数 na.rm = TRUE 传递给 mean 所以 tt returns mean(x, na.rm = TRUE).

R 程序员经常使用的另一种方式是 list(...),如

tt <- function(...) {
    args <- list(...)    # As in this
    if("x" %in% names(args))
        return(args$x)
    else
        return("Something else.")
}

tt(x = 2)
#[1] 2

tt(y = 1, 2)
#[1] "Something else."

我相信这是他们最喜欢的处理点参数的方式之一,如果不是最喜欢的话。