我通过多个函数传递相同的参数,部分代码看起来像
inner.integral <-function(f,n,i,x,odds,alpha,beta)
{
beta.func(x,alpha,beta) * ( beta.prob(alpha,beta) * eval(call(paste("func",as.character(i),as.character(alpha+1),sep=".")),(x*(1+f*odds)))+(1-beta.prob(alpha,beta))*eval(call(paste("func",as.character(i),as.character(alpha),sep=".")),(x*(1-f))))
}
inner.integral.int <- function(f,n,i,x,odds,alpha,beta) {
integrate(inner.integral,lower=0,upper=1,n=n,i=i,
x=x,odds=odds,alpha=alpha,beta=beta)
}
inner.integral.int.2 <- function(f,n,i,x,odds,alpha,beta) {
y <- inner.integral.int(f,n,i,x,odds,alpha,beta)$value
return(y)
}
通过优化函数将参数传递到inner.integral.int.2
时,类似:
optimise(inner.integral.int.2,lower=min.f,
upper=max.f,n=n,i=i,x=x,odds=odds,alpha=a,beta=b)
对于定义的min.f,max.f,n,i,x等我收到错误:
Error in paste("func", as.character(i), as.character(alpha + 1), sep = ".") :
argument "i" is missing, with no default
我做错了什么?
答案 0 :(得分:2)
您应该做的第一件事就是清理代码。您不希望只有一行长度为245个字符的代码。
除非绝对必要,否则你也应该避免使用eval(call(paste(
,而不是这样。至少,您可以切换到使用可以传递字符串和输入列表的do.call
,而不需要创建call
对象。但更好的做法是避免将函数名称作为字符串进行操作,并定义func
以i
和alpha
作为输入(以及当前输入),否则创建一个函数列表func[[i]]
,每个函数都以alpha
作为输入。
最有可能的是,如果你这样做,问题就会消失或变得明显。
答案 1 :(得分:0)
我认为你可能会遇到R懒惰评估的问题。您的示例非常复杂(查看您包含的所有参数),但作为第一步,请尝试添加以下行:
force(i)
在你的职能中,即
inner.integral.int <- function(f,n,i,x,odds,alpha,beta) {
force(i)
integrate(inner.integral,lower=0,upper=1,n=n,i=i,
x=x,odds=odds,alpha=alpha,beta=beta)
}
有关详细信息,请参阅?force
。