当我正在浏览Kaggle比赛的起始R脚本时,我看到这个函数被创建以找到所有行的总和。这是代码:
#Function to sum across rows for variables defined
psum <- function(..., na.rm = FALSE) {
rowSums(do.call(cbind, list(...)), na.rm = na.rm)
}
有人可以解释一下这个功能发生了什么吗?
另外,这与仅使用rowSums
答案 0 :(得分:6)
实际上不需要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
VS。这段代码硬编码为使用cbind
的3个参数:
rowSums(cbind(BOD, 2*BOD, 3*BOD)) # hard coded
[1] 55.8 73.8 132.0 120.0 123.6 160.8
答案 1 :(得分:3)
它创建了一个名为psum
的函数,它接受&#34;任何&#34; (...)和na.rm
参数。
这将传递给do.call
,并且传递给...
的所有内容都将作为列表传递。从本质上讲,do.call会cbind
在...
中传递的所有限制,其中包含对cbind
有效的所有限制。如果某个值恰好是NA
,则会将其删除。或者不是,取决于na.rm
值。