例如,我有一个使用R语言的简单函数:
f<-function(x){
y=(x+2)/3
return(y)
}
我想在其自身的输出(即y1=f(x), y2=f(f(x)), y3=f(f(f(x))), y4=f(f(f(f(x)))), y5=f(f(f(f(f(x)))))
)上评估此函数五次。
有没有一种更简单的方法来执行一个函数的形式,例如,当第一个参数为x
且第二个参数为求值次数(即n
)时,具有两个参数的函数。例如,对于x=3
和n=5
,我希望有一个函数f2<-(x=3,n=5)
,其输出将是矢量或长度等于n
的列表的形式值:
y1=f(3)=1.666667
y2=f(f(3))=1.222222
y3=f(f(f(3)))=1.074074
y4=f(f(f(f(3))))=1.024691
y5=f(f(f(f(f(3)))))=1.00823
如何在R中编写这样一个函数?
答案 0 :(得分:4)
在另一篇文章中使用accepted answer,只需使用SELECT s.Parent_id, SUM(s.market_value) AS ParentSecMktValue
FROM security s
GROUP BY s.Parent_id
;
来创建构图Reduce
。
g
答案 1 :(得分:3)
您可以编写一个辅助函数,例如:
iterate <- function(f,s,n){
iterates <- vector(length = n+1)
iterates[1] <- s
for(i in 1:n){
iterates[i+1] <- f(iterates[i])
}
iterates
}
然后例如
> iterate(function(x){(x+2)/3},3,5)
[1] 3.000000 1.666667 1.222222 1.074074 1.024691 1.008230
您当然可以修改上面的代码,以使向量以f(s)
而不是s
开头。
答案 2 :(得分:2)
您还可以如下调整原始功能:
f2<-function(x, steps){
ans<-c(x)
for (i in 1:steps) {
y=(x+2)/3
ans=append(ans,y)
x = y
}
return(ans)
}
f2(3,5)
#> [1] 3.000000 1.666667 1.222222 1.074074 1.024691 1.008230
答案 3 :(得分:1)
Reduce
上添加“垃圾”参数, f
将执行此操作。如果只需要最后一个结果集accumulate = F
或仅从函数中删除accumulate
参数
f<-function(x, junk){
y=(x+2)/3
return(y)
}
Reduce(f, x = numeric(5), init = 3, accumulate = T)
# [1] 3.000000 1.666667 1.222222 1.074074 1.024691 1.008230
或与purrr
purrr::accumulate(numeric(5), f, .init = 3)
# [1] 3.000000 1.666667 1.222222 1.074074 1.024691 1.008230