1

我需要从另一个函数内部调用mlogit() R函数。

这是一个用于演示目的的函数:

#-------------------------
# DEMO FUNCTION
#-------------------------
# f = formula (string)
# fData = data.frame
# cVar = choice variable (string)
# optVar = alternative variable (string)
##########################
mlogitSum <- function(f, fData,  cVar="choice", optVar="option"){
  library(mlogit)
  r2 <- mlogit(as.formula(f), shape = "long", data = fData, alt.var=optVar, choice = cVar)
  return(summary(r2))
}

显然存在环境问题,因此 mlogit() 函数找不到未全局声明的变量作为参数。

此示例不起作用:

mydata <- read.csv(url("http://www.ats.ucla.edu/stat/r/dae/mlogit.csv"))
attach(mydata)
library(mlogit)
mydata$brand<-as.factor(mydata$brand)
mlData<-mlogit.data(mydata, varying=NULL, choice="brand", shape="wide")

myFormula <-"brand~1|female+age"
var1 <- "brand"
var2 <- "alt"
mlogitSum(myFormula, fData = mlData, var1, var2)

如果在主环境中分配变量,则它可以工作:

mydata <- read.csv(url("http://www.ats.ucla.edu/stat/r/dae/mlogit.csv"))
attach(mydata)
library(mlogit)
mydata$brand<-as.factor(mydata$brand)
fData<-mlogit.data(mydata, varying=NULL, choice="brand", shape="wide")

myFormula <-"brand~1|female+age"
cVar <- "brand"
optVar <- "alt"
mlogitSum(myFormula, fData, cVar, optVar)

或者,如果我从函数内部全局分配变量,它也可以工作

#-------------------------
# DEMO FUNCTION
#-------------------------
# f = formula (string)
# fData = data.frame
# cVar = choice variable (string)
# optVar = alternative variable (string)
##########################
mlogitSum_rev <- function(f, fData,  cVar="choice", optVar="option"){
  fData<<-fData
  cVar<<-cVar
  optVar<<-optVar
  #return(head(lcmData))
  library(mlogit)
  #mi serve per poi estrarre model.matrix(r2), per il resto sarebbe ridondante
  r2 <- mlogit(as.formula(f), shape = "long", data = fData, alt.var=optVar, choice = cVar)
  return(summary(r2))
}

mydata <- read.csv(url("http://www.ats.ucla.edu/stat/r/dae/mlogit.csv"))
attach(mydata)
library(mlogit)
mydata$brand<-as.factor(mydata$brand)
mlData<-mlogit.data(mydata, varying=NULL, choice="brand", shape="wide")

myFormula <-"brand~1|female+age"
var1 <- "brand"
var2 <- "alt"
mlogitSum_rev(myFormula, mlData, var1, var2)

关于如何避免全局分配变量的任何想法?

4

1 回答 1

4

tl;博士这似乎是一个错误mlogit,您可以自己修复(见下文)或要求维护者修复。

在内部mlogit,该函数尝试按如下方式评估数据:

nframe <- length(sys.calls()) ## line 11
... 
data <- eval(mldata, sys.frame(which = nframe))  ## line 44

这是对 R 的作用域结构的适度复杂的混乱——它试图在当前帧之上的mldata第一帧中进行评估,如果有人做了一些棘手的事情(但完全合理!),比如从函数中调用,它将失败。mlogit

我通过运行解决了问题(有点!)fix(mlogit),这会将您转储到编辑器中并允许您修改功能。我将第 44 行更改为

data <- eval(mldata, parent.frame())

之后代码似乎起作用了。

如果这对您有用,您可以 (1)fix()每次需要使用它时使用 mlogit:(2) 下载源 ( .tar.gz) 包的副本,修改并安装它;或(3)[最好!]联系包维护者,让他们知道这个问题,并要求他们发布一个补丁版本......

PS 根据您的一般数据分析协议,您可能希望摆脱使用的习惯attach为什么不建议在 R 中使用 attach(),我应该改用什么?

于 2012-04-12T16:09:29.700 回答