18

ガイドラインとして、明示的に反復するのではなく、lapplyまたは* ply(plyrから)を使用してリストの要素に関数を適用することをお勧めします。ただし、これは、一度に1つのリストを処理する必要がある場合にうまく機能します。関数が複数の引数を取る場合、私は通常、サイクルを実行します。

私は、よりクリーンな構造を持ちながら、本質的に機能することが可能かどうか疑問に思いました。考えられるアプローチの1つは、Pythonのような関数zip(x、y)を定義することです。これは、入力リストを受け取り、i番目の要素がlist(x、y)であるリストを返し、その関数をに適用します。このリスト。しかし、私の質問は、私が最もクリーンなアプローチを使用しているかどうかです。私はパフォーマンスの最適化について心配していませんが、むしろ明快さ/優雅さについて心配しています。

以下は素朴な例です。

        A <- as.list(0:9)
        B <- as.list(0:9)
        f <- function(x, y) x^2+y

        OUT <- list()
        for (n in 1:10) OUT[[n]] <- f(A[[n]], B[[n]])
        OUT
        [[1]]
        [1] 0

        [[2]]
        [1] 2

        ...

そして、これがzip形式の例です(任意の引数に拡張できます):

zip <- function(x, y){
    stopifnot(length(x)==length(y))
    z <- list()
    for (i in seq_along(x)){
        z[[i]] <- list(x[[i]], y[[i]]) 
    }
    z
}
E <- zip(A, B)

lapply(E, function(x) f(x[[1]], x[[2]]))

[[1]]
[1] 0

[[2]]
[1] 2

 ...
4

3 に答える 3

29

私はあなたが探していると思いますmapply

   ‘mapply’ is a multivariate version of ‘sapply’.  ‘mapply’ applies
     ‘FUN’ to the first elements of each ...  argument, the second
     elements, the third elements, and so on.  Arguments are recycled
     if necessary.

あなたの例では、mapply(f, A, B)

于 2011-05-26T22:25:42.000 に答える
1

私が「暗黙のループ」と呼んでいるもの(この名前は完全にはヒットしませんが、何でも)でこれを行うことができると思います*apply

OUT <- lapply(1:10, function(x) (A[[x]]^2 + B[[x]]))

また

OUT <- lapply(1:10, function(x) f(A[[x]], B[[x]]))

vapply次に、出力管理(つまり、リストが必要ない場合)に(または'sapply`)を使用することもできることに注意してください。

(ちなみに、この機能で欲しいものが手に入らないzipので、ポイントを逃してしまったらごめんなさい。)

于 2011-05-26T22:31:24.417 に答える