在函数内调用glmulti时找不到错误对象

时间:2014-07-11 14:05:32

标签: r function

我在自己的功能中使用glmulti包时遇到了麻烦。

以下代码是重现错误的简化示例: 错误:对象' poplrun'找不到

这是在函数中创建的data.frame。 在第二个例子中,它没有找到参数l。

我认为问题与调用glmulti的环境有关。我找到了这篇文章

Trouble passing on an argument to function within own function

并尝试将do.callsubstitute(poplrun)as.name("poplrun")一起使用,但显然我错过了一些东西,因为它没有用。我也找到了这篇文章 Object not found error when passing model formula to another function

并尝试识别公式中的环境(正如您在第一个示例中看到的那样),但这个环境也不起作用。 我真的很感激任何帮助,因为我现在已经两天试图解决这个难题......

谢谢堆!

示例1

    set.seed(5)
    df1<-data.frame(Scenario=rep(LETTERS[1:2], each=10), 
                   Iteration=rep(1:10, 2), V1=rnorm(n=20, mean=0.5, sd=0.1))
    LookUpT<-data.frame(Scenario=rep(LETTERS[1:5]), SV1=1:5, SV2=6:10 )
    InteractRun<- function (
      param="V1" , 
      SVs=c("SV1", "SV2"),
      ic="aic",
      l=1 
      ) {
         poplrun<-df1
         require(plyr)
         poplrun<- join(poplrun, LookUpT, by = 'Scenario', type="left")
         xs<-paste(SVs, collapse="*") 
         .env<-environment() 
         formula<-as.formula(paste0(param, "~", xs), env=.env)
         require(betareg)
         require(glmulti)
         cand<-glmulti(formula, data=poplrun, method="d", level=l, 
         fitfunc=betareg,  na.action=na.omit)
         print(cand)
       }
       InteractRun()

示例2

    set.seed(5)
    df1<-data.frame(Scenario=rep(LETTERS[1:2], each=10), Iteration=rep(1:10, 2), 
            V1=round(rnorm(n=20, mean=20, sd=2))) 
    LookUpT<-data.frame(Scenario=rep(LETTERS[1:5]), SV1=1:5, SV2=6:10 ) 
    InteractRun<- function (
    param="V1" , 
    SVs=c("SV1", "SV2"), 
    fam="poisson",
    ic="aic",
    l=1 
    ) {
       poplrun<-df1
       require(plyr)
       poplrun<- join(poplrun, LookUpT, by = 'Scenario', type="left")
       xs<-paste(SVs, collapse="*") 
       formula<-as.formula(paste0(param, "~", xs)) # set up formula to be used  
       glm1<-glm(data=poplrun, formula, family=fam, na.action=na.omit)
       require(glmulti)
       cand<-glmulti(glm1, method="d", level=l,  na.action=na.omit)
       print(cand)
      }
     InteractRun()

1 个答案:

答案 0 :(得分:4)

我要回答我自己的问题......过了一会儿,我想出了如何解决这个问题。 对glmulti的正确调用是使用do.call,但不需要substitute()as.name()。在示例1中,调用应该是: cand <- do.call("glmulti", list(formula, data=poplrun, method="d", level=l, fitfunc=betareg, na.action=na.omit)) 在例2中: cand <- do.call("glmulti", list(glm1, method="d", level=l, na.action=na.omit))