r - 将未评估的参数替换为多个函数

标签 r

考虑以下函数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

有没有办法将参数作为表达式传递,可能使用 quotesubstitute,以便 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/

相关文章:

r - 如何强制 ggplot 的 geom_tile 填充每个方面?

r - 使用希腊字母命名 R 中的列表元素

r - 使用 R 中的 pip2d 函数,我们如何知道顶点的正确 'order'?

java - 使用 RServe 从 Java 调用 R 奇怪的错误

r - 各组累计平均值

r - 绘制 sf 对象时出错 --- 错误 : could not find function "geom_sf"

r - 根据数据框中的公共(public)标识符和特定列按比例划分行值

r - X 轴和堆叠条中的右框

r - 基于 data.table R 中的列的条件滚动差异或梯度

html - html 输出中的 xtable thead