2013-10-13 104 views
0

我通過多種功能傳遞相同的參數傳遞參數,代碼的部分看起來像通過嵌套函數

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 

我做錯了什麼?

回答

1

你應該做的第一件事就是清理你的代碼。您不想擁有長度爲245個字符的單行代碼。

你也應該避免eval(call(paste(,除非它是絕對必要的,在這裏它不是。至少,您可以切換到使用do.call,它可以傳遞一個字符串和一個輸入列表,並且不需要創建一個call對象。但更好的做法是避免將函數名稱作爲字符串操作,並且要麼定義func以獲取ialpha作爲輸入(以及當前輸入),要麼創建func[[i]]的函數列表,其中每個函數都將alpha作爲一個輸入。

最有可能的是,如果你這樣做,問題將會消失或變得明顯。

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詳細信息。