我需要从另一个函数中调用mlogit() R function。
这是一个用于演示目的的功能:
#-------------------------
# 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)
有关如何避免全局分配变量的想法吗?
答案 0 :(得分:4)
tl; dr 这似乎是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
:Why is it not advisable to use attach() in R, and what should I use instead?