我想将一个函数f()应用于一个值n次。
例如,如果我想应用此功能5次,我会做类似的事情:
f(f(f(f(f(1)))))
有没有适合的解决方案?
例如,某些函数y如下:
y( 1, f, 5)
答案 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
需要一个x
和y
参数。尽管必须将两者都传递给函数,但是您可以选择不像我一样使用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)