无需列出向量即可在向量列表上应用均值的函数(对函数调用的更改)

Function to apply mean on a list of vectors without need to list the vectors (changes to a function call)

我有多个对象,我需要对它们应用一些函数,在我的示例中 mean。但是函数调用不应该包括list,它必须看起来像这样:my_function(a, b, d)。 请建议如何操作,可能我需要 quotesubstitute,但我不确定如何使用它们。

a <- c(1:15)
b <- c(1:17)
d <- c(1:19)
my_function <- function(objects) {
  lapply(objects, mean)
}
my_function(list(a, b, d))

可能的解决方案:

a <- c(1:15)
b <- c(1:17)
d <- c(1:19)

my_function <- function(...) {
  lapply(list(...), mean)
}

my_function(a, b, d)

#> [[1]]
#> [1] 8
#> 
#> [[2]]
#> [1] 9
#> 
#> [[3]]
#> [1] 10

为了仍然能够从 mean 的其他参数中受益,例如 na.rm=trim=,即概括地说,我们可以 match formalArgs 并相应地拆分调用。

my_function <- function(...) {
  cl <- match.call()
  m <- match(formalArgs(base:::mean.default), names(cl), 0L)
  vapply(as.list(cl)[-c(1L, m)], function(x) {
    eval(as.call(c(quote(base:::mean.default), list(x), as.list(cl[m]))))
  }, numeric(1L))
}

## OP's example
my_function(a, b, d) 
# [1]  8  9 10


## generalization:
set.seed(42)
my_function(rnorm(12), rnorm(5), c(NA, rnorm(3)))
# [1]  0.7553736 -0.2898547         NA

set.seed(42)
my_function(rnorm(12), rnorm(5), c(NA, rnorm(3)), na.rm=TRUE)
# 0.7553736 -0.2898547 -1.2589363 

set.seed(42)
my_function(rnorm(12), rnorm(5), c(NA, rnorm(3)), na.rm=TRUE, trim=.5)
# 0.5185655 -0.2787888 -2.4404669 

数据:

a <- 1:15; b <- 1:17; d <- 1:19