R语言中函数中的函数

eivnm1vs  于 12个月前  发布在  R语言
关注(0)|答案(4)|浏览(153)

我有一个简单的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=3n=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中编写这样一个函数?

zf2sa74q

zf2sa74q1#

在另一篇文章中使用accepted answer,只需使用Reduce来创建组合g

composite <- function(g, h) {function(...)g(h(...))}
g <- Reduce(composite, list(f, f, f, f, f))

g(2)
f(f(f(f(f(2)))))

identical(g(2), f(f(f(f(f(2))))))
#[1] TRUE
slsn1g29

slsn1g292#

你可以写一个helper函数,如下所示:

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开始。

mo49yndu

mo49yndu3#

你也可以像下面这样调整你的原始函数:

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
6uxekuva

6uxekuva4#

如果您向f添加一个“junk”参数,Reduce将执行此操作。如果您只需要最后一个结果集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

相关问题