повторять / составлять функцию на себя n раз - PullRequest
0 голосов
/ 16 ноября 2018

Предположим, у меня есть произвольная функция

foo = function(a,b) {a+b}

Как я могу перебрать эту функцию на себя n раза?

foo(foo(foo(foo(x, 1), 2), 3, 4)

Я смотрю на purrr:compose, но это не выглядит обнадеживающим для произвольного n. purrr:reduce такое ощущение, что он тоже вступит в игру ... но я в тупике.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вот чистая purrr версия, которая действительно функциональна, как вы сказали, reduce здесь пригодится, так как compose - это просто функция, а функции - это просто элементы, которые вы можете уменьшить, составляя их. Чтобы просто заполнить один аргумент, используйте partial.

foo_n <- reduce(map(1:n, ~partial(foo, b=.x)), compose)
0 голосов
/ 16 ноября 2018

Вы также можете просто добавить результаты каждой функции foo(a,b) в числовой вектор, а затем получить последний результат.

Давайте x = 1 и b s являются элементами 1:4:

x = 1
n = 4

out = vector("numeric")
steps = seq(1, 4, by = 1)

for( b in steps){
  ## initial value
  if (length(out) == 0){

      out = append(out, values = foo(x, b) )
    }else{

      out = append(out, values = foo( tail( out, 1), b) )
    }

}
tail(out, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...