実際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 を動的に作成できますが、2 番目のケースでは 3 つの引数にハードコーディングされています。
たとえば、次のコードは、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
vs. 3 つの引数を使用するようにハードコーディングされたこのコードcbind
:
rowSums(cbind(BOD, 2*BOD, 3*BOD)) # hard coded
[1] 55.8 73.8 132.0 120.0 123.6 160.8