2

我通过多个函数传递相同的参数,部分代码看起来像

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

我做错了什么?

4

2 回答 2

2

你应该做的第一件事是清理你的代码。您不希望有一行 245 个字符长的代码。

除非绝对必要,否则您也应该避免eval(call(paste(,而这里不是。至少,您可以切换到使用do.callwhich 可以传递字符串和输入列表,并且不需要创建call对象。但更好的做法是避免将函数名称作为字符串进行操作,并定义funcialpha作为输入(以及当前输入),或者创建一个函数列表,func[[i]]每个函数都alpha作为输入。

最有可能的是,如果您这样做,问题将消失或变得明显。

于 2013-10-13T19:58:24.073 回答
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

于 2013-10-13T19:55:28.943 回答