我想将函数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
需要一个x
和y
参数。虽然您必须将两者都传递给您的函数,但您可以选择不像我所做的那样使用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)