2017-01-10 14 views
3

私はロシアの人形のようにもう一つの関数を入れ子にするだけで、Rのこの再帰的な操作(畳み込み)を続けています。問題は、これを行うよりエレガントな方法があるかどうかです。Rのネストされた操作より洗練された方法はありますか?

ones = c(1, 1, 1, 1, 1, 1) 
twos = c(1, 0, 1, 0, 1, 0) 
threes = c(1, 0, 0, 1, 0, 0) 
fours = c(1, 0, 0, 0, 1, 0) 

実際の行は次のとおりです:

round(convolve(convolve(convolve(ones, rev(twos), type="open"), rev(threes), type="open"), rev(fours), type="open")) [1] 1 1 2 3 5 6 6 8 8 8 6 6 5 3 2 1 1 0 0 0 0

+0

は '(リデュース)'ベースRで、かつ 'タイプミスは今@RichScriven purrr' –

+0

'に ')(減らします修正されました。これにつきましては申し訳ございません。 – Toni

答えて

5
library(purrr) 
data <- list(ones, twos, threes, fours) 
round(reduce(data, ~ convolve(.x, rev(.y), type = "open"))) 

あなたがベースReduce()と同じ達成することができますがあり

round(Reduce(f = function(x, y) convolve(x, rev(y), type = "open"), x = data)) 
1

私はそこにあるかどうかを言うことができない確かに、次の入力ベクトルを設定するためのより良い方法があると

を開始するには関数を設定するより良い方法ですが、Rの dplyrパッケージを使用すると、より構文を少し良く書くことができます。

library(dplyr) 
ones %>% 
    convolve(rev(twos), type = "open") %>% 
    convolve(rev(threes), type = "open") %>% 
    convolve(rev(fours), type = "open") %>% 
    round 
+0

ありがとうございます。 – Toni

関連する問題