考虑以下函数foo
。我想将 na.rm = TRUE
硬编码到返回结果的列表中的每个调用中,但我只想写一次。我当前的实现不起作用。
foo <- function(x) {
e <- expression(na.rm = TRUE)
list(sum(x, eval(e)), mean(x, eval(e)), sd(x, eval(e)))
}
我不想在此函数的参数列表中使用 ...
。我不想让用户选择添加 na.rm
参数。上面代码的问题在于
> eval(expression(na.rm = TRUE))
# [1] TRUE
因此 TRUE
被传递给 mean
中的 trim
参数,而不是 na.rm
> foo(c(1, NA, 3))
# Error in mean.default(x, eval(e)) : 'trim' must be numeric of length one
有没有办法将参数作为表达式传递,可能使用 quote
或 substitute
,以便 R 将参数读取为 na.rm = TRUE
而不仅仅是 TRUE
?
注意:我的实际函数是在七行中使用了五次 quiet = TRUE
,所以如果我可以只写一次表达式并通过五个函数中的每一个。
最佳答案
我真的不知道这是否是一个好主意,但你想做的事情可以用 do.call
来完成:
foo <- function(x) {
args <- list(quote(x),na.rm=TRUE)
list(
do.call(sum,args),
do.call(mean, args),
do.call(sd, args)
)
}
正如 Hadley 在评论中所说,您不想将 x
完全复制到列表 args
中,因为当 x
很大。因此使用 quote()
(thx Hadley)
这给出了:
> foo(c(1, NA, 3))
[[1]]
[1] 4
[[2]]
[1] 2
[[3]]
[1] 1.414214
关于r - 将未评估的参数替换为多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25564215/