在它自己的输出上重新循环一个函数
Relooping a function over its own output
我已经定义了一个函数,我想多次将其重新应用于它自己的输出。我试过了
replicate(1000,myfunction)
但意识到这只是将我的函数应用于我的初始输入 1000 次,而不是每次都将我的函数应用于新输出。实际上我想要的是:
function(function(...function(x_0)...))
1000 次以上,能够看到每个阶段的变化。
我之前将b定义为某个长度为7的向量
b_0=b
C=matrix(0,7,1000)
for(k in 1:1000){
b_k=myfun(b_(k-1))
}
C=rbind(b_k)
C
这是我想要的正确想法吗?
你可以试试递归函数:
rec_func <- function(input, i=1000) {
if (i == 0) {
return(input)
} else {
input <- myfunc(input)
i <- i - 1
rec_func(input, i)
}
}
例子
myfunc <- function(item) {item + 1}
> rec_func(1, i=1000)
[1] 1001
纯函数式编程方法,使用 functional
包中的 Compose
:
library(functional)
f = Reduce(Compose, replicate(100, function(x) x+2))
#> f(2)
#[1] 202
但是这个解决方案不适用于太大的n
!很有意思。
您可以为此使用 Reduce。例如
add_two <- function(a) a+2
ignore_current <- function(f) function(a,b) f(a)
Reduce(ignore_current(add_two), 1:10, init=4)
# 24
通常 Reduce
期望迭代一组新值,但在这种情况下,我使用 ignore_current
删除序列值 (1:10
),以便只使用参数来控制我们重复这个过程的次数。这与
相同
add_two(add_two(add_two(add_two(add_two(add_two(add_two(add_two(add_two(add_two(4))))))))))
循环在这里工作得很好。
apply_fun_n_times <- function(input, fun, n){
for(i in 1:n){
input <- fun(input)
}
return(input)
}
addone <- function(x){x+1}
apply_fun_n_times(1, addone, 3)
这给出了
> apply_fun_n_times(1, addone, 3)
[1] 4
我已经定义了一个函数,我想多次将其重新应用于它自己的输出。我试过了
replicate(1000,myfunction)
但意识到这只是将我的函数应用于我的初始输入 1000 次,而不是每次都将我的函数应用于新输出。实际上我想要的是:
function(function(...function(x_0)...))
1000 次以上,能够看到每个阶段的变化。
我之前将b定义为某个长度为7的向量
b_0=b
C=matrix(0,7,1000)
for(k in 1:1000){
b_k=myfun(b_(k-1))
}
C=rbind(b_k)
C
这是我想要的正确想法吗?
你可以试试递归函数:
rec_func <- function(input, i=1000) {
if (i == 0) {
return(input)
} else {
input <- myfunc(input)
i <- i - 1
rec_func(input, i)
}
}
例子
myfunc <- function(item) {item + 1}
> rec_func(1, i=1000)
[1] 1001
纯函数式编程方法,使用 functional
包中的 Compose
:
library(functional)
f = Reduce(Compose, replicate(100, function(x) x+2))
#> f(2)
#[1] 202
但是这个解决方案不适用于太大的n
!很有意思。
您可以为此使用 Reduce。例如
add_two <- function(a) a+2
ignore_current <- function(f) function(a,b) f(a)
Reduce(ignore_current(add_two), 1:10, init=4)
# 24
通常 Reduce
期望迭代一组新值,但在这种情况下,我使用 ignore_current
删除序列值 (1:10
),以便只使用参数来控制我们重复这个过程的次数。这与
add_two(add_two(add_two(add_two(add_two(add_two(add_two(add_two(add_two(add_two(4))))))))))
循环在这里工作得很好。
apply_fun_n_times <- function(input, fun, n){
for(i in 1:n){
input <- fun(input)
}
return(input)
}
addone <- function(x){x+1}
apply_fun_n_times(1, addone, 3)
这给出了
> apply_fun_n_times(1, addone, 3)
[1] 4