从函数中的循环中提取结果

时间:2012-08-06 11:06:27

标签: r for-loop

我可能做的事非常愚蠢,但我无法从我的函数循环遍历的一系列模型中提取参数值。

数据:

library(difR)
data(verbal)
TotScore=rowSums(verbal[,c(1:24)])
mydata=verbal[,c(1:24)]

然后我可以在循环中获得模型BIC

library(BMA)
a<-rep(NA,length(1:24))
for (i in (1:24)){
  a[i]<-bic.glm(mydata[,i]~ TotScore, glm.family=binomial,data=mydata)$bic
}
a

但是如果我试着将它放在一个函数中,我就无法提取“a”

myB<-function(mydata){
  a<-rep(NA,length(ncol(mydata)))
  for (i in (1:ncol(mydata))){
    a[i]<-bic.glm(mydata[,i]~ TotScore, glm.family=binomial,data=mydata)$bic
  }
  return(a)
}

myB(mydata)

或者更确切地说,bic仅适用于最后一个模型

我可以为平均值构建相同的函数并设法提取结果,这可能与bic输出的结构有关吗?

非常感谢

中号

1 个答案:

答案 0 :(得分:1)

似乎bic.glm只从全局环境中读取对象 - 您的函数的问题在于它确实识别了函数内本地创建的i。请尝试以下方法:

library(difR)
data(verbal)
TotScore=rowSums(verbal[,c(1:24)])
mydata=verbal[,c(1:24)]

myB<-function(mydata){
    a<-rep(NA,length(ncol(mydata)))
    for (i in (1:ncol(mydata))){
        # force this.col to be in the global environment
        this.col <<- mydata[,i]
        # Alternatively:
        # assign("this.col", mydata[,i], envir=.GlobalEnv)
        a[i]<-bic.glm(this.col ~ TotScore, glm.family=binomial,data=mydata)$bic
    }
    return(a)
}

myB(mydata)

您的函数仍在读取由第一个循环创建的全局i,该循环位于24。

它应该这样做似乎很奇怪;在快速谷歌搜索后,我发现问题herehere的引用(这不是一个非常彻底的搜索,我相信有更好的例子)。我在bic.glm的文档中找不到任何内容,这有点令人惊讶。

从第一个答案到我提供的第二个链接,如果您使用公式但未指定data参数,似乎会发生这种情况。