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



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

例如,如果我想应用这个函数5次,我会做一些类似的事情:

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

有什么解决方案吗?

例如,一些函数y使得:

y( 1, f, 5)

这里有一种使用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-参数函数。函数将被传递累积值作为第一个参数,"下一个"值作为第二个论点。

根据设计,reduce需要一个xy参数。虽然您必须将两者都传递给您的函数,但您可以选择不像我所做的那样使用y。这意味着您的函数只递归地使用累积值。

使用purrr::accumulate-可以看到中间步骤

rep(x, n+1) %>% accumulate(function(x, y) x + 3)
# [1]  1  4  7 10 13 16

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

第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

是否可以使用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)

为了更加健壮,您可能会对参数进行一些错误处理。

这就是我找到的解决方案。它看起来有点冗长,但它确实有效。

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

最新更新