ガイドラインとして、明示的に反復するのではなく、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
...