将可选参数传递给函数,三个点
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."
我相信这是他们最喜欢的处理点参数的方式之一,如果不是最喜欢的话。
我对 ...
的工作原理感到困惑。
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."
我相信这是他们最喜欢的处理点参数的方式之一,如果不是最喜欢的话。