我正在试图弄清楚如何在R中集成以下功能:
item.fill.rate <- function(x, lt, ib, S){
1-((((1/(factorial(S)))*((x*lt*ib)^S)))/
(sum(((1/(factorial(0:S)))*((x*lt*ib)^(0:S))))))}
其中x是变量,lt,ib和S是输入参数
根据此处的上一个主题,我尝试了以下内容:
int.func <- function(lt, ib, S){
item.fill.rate <- function(x){
1-((((1/(factorial(S)))*((x*lt*ib)^S)))/(sum(((1/(factorial(0:S)))*((x*lt*ib)^(0:S))))))
}
return(item.fill.rate)
}
integrate(int.func(0.25, 1, 1), lower=0.25, upper=0.75)$value
申请时,我收到以下错误:
> integrate(int.func(0.25, 1, 1), lower=0.25, upper=0.75)$value
[1] 0.4947184
Warning messages:
1: In (x * lt * ib)^(0:S) :
longer object length is not a multiple of shorter object length
2: In (1/(factorial(0:S))) * ((x * lt * ib)^(0:S)) :
longer object length is not a multiple of shorter object length
我评估了这些对象的长度,但是没有给出任何错误必须指示的地方。
我试图尽可能具体,所以希望有人能够帮助我解决这个问题!
答案 0 :(得分:0)
sum
函数因预期更长的向量而返回单个项目而臭名昭着,因此调用sum
的被积函数通常需要“向量化”,以便它们提供预期的结果(与integrate
成功提供的“x” - 矢量长度相同的向量。 Vectorize函数是sapply
的包装器,对于此过程非常方便。您可以在调用integrate
时设置参数。 (目前我认为你可能在一个长度为1/2的域上积分一个常量。)
item.fill.rate <- function(x,lt, ib, S){
1-((((1/(factorial(S)))*((x*lt*ib)^S)))/(sum(((1/(factorial(0:S)))*((x*lt*ib)^(0:S))))))
}
vint <- Vectorize(item.fill.rate)
integrate(vint, S=1, lt=0.25, ib= 1, lower=0.25, upper=0.75)$value
#[1] 0.4449025