我试图在下面的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]]
}
答案 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时,最好设置种子,以便获得可重现的数据和结果。