2017-01-10 4 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

Существует 'Reduce()' в базовой R, и 'уменьшить()' в 'purrr' –

+0

@RichScriven опечатка сейчас исправленный. Извини за это. – 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

Я не могу сказать, есть ли лучший способ настроить эту функцию, но пакет dplyr в R позволяет лучше писать синтаксис:

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

Благодарим вас за помощь. – Toni

Смежные вопросы