2016-05-20 15 views
1

関数のリストを引数のリストに適用することによって得られたリストを作成するR-idiomaticな方法はありますか?例えば引数のリストに関数のリストを適用する

、私は関数の値の一覧を取得したい、

fnc_vals <- list(f1(x1), f2(x2), f3(x3)) 

fncs <- list(f1, f2, f3) 
args <- list(x1, x2, x3) 

を数(たとえば、3)で同等の機能と、リストの引数のリストを、与えられました

つまり、base-R関数mapplyの一般化された形式をリストfncsargs(引数のリストに1つの関数を適用する)に適用したいと考えています。

これは簡単に行うことができますされています。それはRで、より自然であれば可能になるので

dapply <- function(args, fncs, ...) { # "diagonal" apply 
    lapply(seq_along(args), function(i) fncs[[i]](args[[i]], ...)) 
} 

fnc_vals <- dapply(args, fncs) 

はしかし、私の目に、これは、不器用で、ねじれ-する機能を通じてペアごとを実行することなく、かつ所望の関数値リストを生成するための引数。 でこのように行くだろうPythonの、:

fncs = [f1, f2, f3] 
args = [x1, x2, x3] 
fnc_vals = [f(x) for f, x in zip(fncs, args)] 

は、この「ジッピー」建設は、同様に、Rで実装することができますか?

+2

「地図」、つまり「Map(function(x、y)x(y)、fncs、args)」を試してください。 – akrun

答えて

3

あなたはdo.callで(別のデフォルト値を持つmapplyである)Mapを使用することができます。

fncs <- list(mean, median, sd) 
args <- list(1:5, 11:13, c(1,1,1,2)) 
Map(function(f, x) do.call(f, list(x)), fncs, args) 
#[[1]] 
#[1] 3 
# 
#[[2]] 
#[1] 12 
# 
#[[3]] 
#[1] 0.5 

do.callが第2引数のためのlistを必要とするため、匿名関数が必要です。

とにかく匿名関数を作成するので、Map(function(f, x) f(x), fncs, args)を@akrunが指摘するように使用することができます。

+0

まさに私が望んでいたものです。ありがとう! – egnha

関連する問題