在R - Kaggle入门脚本中执行.call

时间:2015-11-29 17:34:16

标签: r kaggle

当我正在浏览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

有什么不同

2 个答案:

答案 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值。