在R中使函数loopable

时间:2018-01-16 04:32:47

标签: r function for-loop

我试图在下面的R代码中循环f。但f本身就是一个函数(即is.function(f)给出TRUE)。

我想知道f是一个函数,是否可以循环它?

注意: f来自f <- approxfun(...),需要保留为函数,以便我可以使用integrate(f, ...)

这是我的R代码:

den = list()
x = rep(0, 2)
d = list(c(rbeta(1e4, 5, 5), rbeta(1e4, 2, 5)))
f = as.function()       ## What should this be? ##

for(i in 1:2){
den[[i]] <- density(d[[i]])
f[i] <- approxfun(den[[i]]$x, den[[i]]$y, yleft = 0, yright = 0) # how can it become loopable?
x[i] <- integrate(f[i], 0, .1)[[1]]
}

2 个答案:

答案 0 :(得分:1)

在下文中,class(f[1])list,而class(f[[1]])function。因此,您只需要f[[i]]函数中的integrate

den = list()
x = rep(0, 2)

d <- list()
d[[1]] <- rbeta(1e4, 5, 5) 
d[[2]] <- rbeta(1e4, 2, 5)

f <- list()     

for(i in 1:2){

  den[[i]] <- density(d[[i]])
  f[[i]] <- approxfun(den[[i]]$x, den[[i]]$y, yleft = 0, yright = 0) 
  x[i] <- integrate(f[[i]], 0, .1)[[1]]

}

答案 1 :(得分:1)

虽然已经有一个已接受的答案,但我会发布我的,因为我相信你的代码中的主要错误来自于过于努力,你太复杂了。

首先,您不需要功能列表f,只需要一个函数与integrate一起使用,就像您在问题中所说的那样。

其次,您创建d的方式使用了对c的不必要的调用。这个调用将使其参数一个向量,而不是两个随机beta数的向量,这是你想要的。

所以完整的代码只是对你的简化。

set.seed(4149)    # makes the results reproducible

den = list()
x = rep(0, 2)
d = list(rbeta(1e4, 5, 5), rbeta(1e4, 2, 5))

for(i in 1:2){
    den[[i]] <- density(d[[i]])
    f <- approxfun(den[[i]]$x, den[[i]]$y, yleft = 0, yright = 0) # how can it become loopable?
    x[i] <- integrate(f, 0, .1)[[1]]
}

x
#[1] 0.001244482 0.110921241

请注意set.seed的使用,在使用RNG时,最好设置种子,以便获得可重现的数据和结果。