2016-06-23 3 views
0

免責事項:これはこの質問の重複ではありません: How to combine rapply() and mapply(), or how to use mapply/Map recursively? 私は再帰に関数の余分な引数を組み込む方法を尋ねています。Rで関数を再帰的に(ネストされたリストを通して)マップする(?)

だから私はリストがあります:

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

をそして私はリスト構造を維持すること再帰的に異なる機能を適用する必要があります。おそらく、これは()関数は平均値であるとき、このように書きん再帰関数:

recursive = function(x, y){ 
    if(is.null(y)){ 
    if(is.atomic(x)){ 
     x*x 
    } else{ 
     Map(recursive, x) 
    } 
    } else{ 
    if(is.atomic(y) && is.atomic(x)){ 
     x*y 
    } else{ 
     Map(recursive, x, y) 
    } 
    } 
} 

だから、所望の結果は次のようになります。

recursive(A,B) 

私はどのように私はこの再帰を一般化可能性が思っていましたハードコーディングされたfunction(x,y) x*y以上の機能には、便利に機能を変更することができますか?その場合 、それはで始まるでしょう:

recursive = function(somefunction, x, y){ 
.... 
} 

somefunction = function(x,y) x*y #or any other function taking x and y as inputs 

は、誰もが親切に私に道を示してもらえますか?どうもありがとうございます。

+0

こんにちは@akrunこれは私が前に尋ねたことの重複した質問ではありません... – shenglih

+0

希望の結果がここに何であるかはわかりません。あなたはこのリストで何をしようとしていますか? – MrFlick

+0

こんにちは@MrFlick、コメントありがとう!私はネストされたリストに多くの異なる関数を適用しようとしていて、便利なプラグインが可能な一般的な再帰関数が好きです... – shenglih

答えて

1

を使用でき

recursive <- function(fun, x, y) { 
    if(is.atomic(x) && is.atomic(y)) { 
     match.fun(fun)(x, y) 
    } else { 
     Map(recursive, x, y, MoreArgs=list(fun=fun)) 
    } 
} 

理由はMap通話mapplymapplyはあなたがあなたが反復処理したくない呼び出し元の関数に渡したい他のパラメータを指定することができMoreArgs=パラメータを持っていることです。

+0

MoreArgsを説明してコメントしてくれてありがとう私を助けるために前後に! – shenglih

関連する問題