其实do.call
是不需要的。它本可以(并且应该)以更简单的方式编写,如下所示:
psum2 <- function(..., na.rm = FALSE) rowSums(cbind(...), na.rm = na.rm)
psum2(BOD, BOD)
# [1] 18.6 24.6 44.0 40.0 41.2 53.6
psum(BOD, BOD) # same
# [1] 18.6 24.6 44.0 40.0 41.2 53.6
注意:通常我们使用 do.call 当我们不知道有多少参数将被传递给一个函数,所以我们想要传递给函数一个它们的列表。以下:
L <- list(arg1, arg2, arg3)
do.call(f, L)
等同于:
f(arg1, arg2, arg3)
但在第一种情况下,我们可以动态创建 L 以便它可以有任意数量的参数,而第二种情况被硬编码为三个参数。
例如,这个代码可以通过改变 n 来改变(其中 n 可以是 1、2、3,...):
n <- 3
L <- lapply(1:n, function(i) i * BOD) # create list of n components
rowSums(do.call(cbind, L))
[1] 55.8 73.8 132.0 120.0 123.6 160.8
与此代码相比,该代码被硬编码为使用 3 个参数cbind
:
rowSums(cbind(BOD, 2*BOD, 3*BOD)) # hard coded
[1] 55.8 73.8 132.0 120.0 123.6 160.8