purrr-如何在一个值上递归应用n_times个函数

时间:2018-10-27 21:14:27

标签: r purrr

我想将一个函数f()应用于一个值n次。

例如,如果我想应用此功能5次,我会做类似的事情:

f(f(f(f(f(1)))))

有没有适合的解决方案?

例如,某些函数y如下:

y( 1, f, 5)

3 个答案:

答案 0 :(得分:4)

这是使用purrr::reduce的一种方法。这有点作弊(也许不是吗?),但似乎有效。在下面的演示中,我将3递归加到我的初始值5次-

library(purrr)

x <- 1
n <- 5

rep(x, n+1) %>% reduce(function(x, y) x + 3)
# [1] 16

这是reduce-

的文档
  

.x列表或原子向量。

     

.f对于reduce(),是2个参数的函数。该函数将被传递   累积值作为第一个参数,“ next”值作为   第二个参数。

根据设计,reduce需要一个xy参数。尽管必须将两者都传递给函数,但是您可以选择不像我一样使用y。这意味着您的函数仅递归使用累加值。

可以使用purrr::accumulate-

查看中间步骤
rep(x, n+1) %>% accumulate(function(x, y) x + 3)
# [1]  1  4  7 10 13 16

请注意,该函数未应用于第一个实例,这就是为什么您需要n+1中的rep才能获得正确的结果。

编辑1: 这是上述逻辑的简化版本-

reduce(1:n, function(x, y) x + 3, .init = x)
# [1] 16

accumulate(1:n, function(x, y) x + 3, .init = x)
# [1]  1  4  7 10 13 16

编辑2: 这是一个类似但更简单的基本R解决方案-

Reduce(function(x, y) x + 3, 1:n, init = x)
# [1] 16

答案 1 :(得分:0)

可以使用purrr::map并将其放在y中循环吗?

f <- function(n) n^2 # or any other function of n

y <- function(n, fun, k = 1) {

  x <- n
  for (i in 1:k) {
    x <- unlist(purrr::map(x, fun))
  }

  return(x)

}

# then to do f five times would be:
y(1, f, 5)

为使功能更强大,您可能需要对参数进行一些错误处理。

答案 2 :(得分:0)

这是我找到的解决方案。看起来有些冗长,但可以。

  reduce(
       rerun(5, f), 
  compose)(1)