2016-06-19 4 views
3

ネストされたリストに再帰的にmapply()を使用するために、rapply(, how = "replace")mapply()の機能を組み合わせる簡単な方法があるのだろうかと思っていました。rapply()とmapply()を組み合わせる方法、またはmapply/Mapを再帰的に使う方法は?

たとえば、私は2つのネストされたリストがあります:

A = list(list(c(1,2,3), c(2,3,4)), list(c(4,3,2), c(3,2,1))) 
B = list(list(c(1,2,3), c(2,3,4)), list(c(4,3,2), c(3,2,1))) 

をさんは、私がAとBのすべての対応する要素にfunction(x, y) x + yを適用し、入れ子構造を保持したいとしましょう。望ましい結果は、私は、これはrapply(x, f, how = "replace")mapply()アナログすべきだと思います

result = list(list(c(2,4,6), c(4,6,8)), list(c(8,6,4), c(6,4,2))) 

だろうが、それらを統合する方法を見つけ出すことができませんでした。誰も親切に私にこれについてのいくつかの指摘を与えることができますか?

もう1つの簡単な質問は、通常、集中的な計算、入れ子にされたリストまたは多次元配列の方が高速ですか?すべてのコメントは非常に感謝しています!

答えて

3

それとも限り、AとBが同じ構造を持っているように動作しますこれを達成するためにMapと組み合わせ再帰関数、書くことができます、

s <- function(x, y) tryCatch(x + y, error = function(e) Map(s, x, y)) 
s(A, B) 

[[1]] 
[[1]][[1]] 
[1] 2 4 6 

[[1]][[2]] 
[1] 4 6 8 


[[2]] 
[[2]][[1]] 
[1] 8 6 4 

[[2]][[2]] 
[1] 6 4 2 

ないあなたは、この場合にrapplyを使用できるかどうかを確認しますが再帰的に単一のリストをループします。しかし、同時に2つのリストを再帰的にループするには、より高いレベルの再帰が必要ですか?私が間違っている?

+0

ありがとうPsidom!私はこれが上記の解決策よりもとてもきちんとしており、より一般的であることを認識しました!! – shenglih

+1

'tryCatch'の代わりに' s'のオーバーヘッドを避けるためには 'function(x、y)if(is.atomic(x)&& is.atomic(y))x + y else map(s、x、 y) ' –

1

あなたはこれを達成するために(2回)を再帰的にMapを使用することができます。

Map(function(i, j) Map(function(x, y) x + y, i, j), A, B) 

[[1]] 
[[1]][[1]] 
[1] 2 4 6 

[[1]][[2]] 
[1] 4 6 8 


[[2]] 
[[2]][[1]] 
[1] 8 6 4 

[[2]][[2]] 
[1] 6 4 2 

mapplyを使用するには、= FALSE簡素化する必要があるだろうが、それはMapのデフォルトです。外側のリスト要素は最初のMapに供給され、内側のリスト要素は2番目のMapに供給されます。

+0

ありがとうございます。 Reduce()を再帰的に使用する方法をデモンストレーションしてもいいですか?何かReduce(関数(x)Reduce( '+'、x)、A)はAのベクトルを再帰的に要約するバグです... – shenglih

+0

私はそれに@MeredithHuを試すことができますが、以下のように、他のものはいくつかのきちんとした解決策を提供するかもしれないので、別の質問として。 – lmo

関連する問題