2

Kaggle コンペティションのスターター R スクリプトを調べていたとき、すべての行の合計を見つけるためにこの関数が作成されているのを見ました。コードは次のとおりです。

#Function to sum across rows for variables defined
psum <- function(..., na.rm = FALSE) {
     rowSums(do.call(cbind, list(...)), na.rm = na.rm)
}

誰かがこの機能で何が起こっているのか説明してもらえますか?

また、これは just を使用するのとどう違うのrowSumsですか?

4

2 に答える 2

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 を動的に作成できますが、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
于 2015-11-29T17:53:41.717 に答える
3

psum「何でも」(...) とna.rm引数を受け入れるという関数を作成します。これは に渡されdo.call、渡されたものはすべて...リストとして渡されます。本質的に、do.call は、有効なすべての制限とともにcbind渡されたものすべてを処理します。ある値がたまたま である場合、それは削除されます。値に応じて、またはそうでない。...cbindNAna.rm

于 2015-11-29T17:40:01.677 に答える