2012-04-12 100 views
1

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

这是为了便于说明功能:

#------------------------- 
# 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) 

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

在此先感谢

+0

你的第一个例子为我运行。你能更具体地说明你的问题吗? – joran 2012-04-12 15:41:12

+0

您是否愿意编辑您的问题而不是在评论中留下更新/更正的版本? – 2012-04-12 15:49:04

回答

3

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()) 

之后代码似乎工作。 (2)下载源代码(.tar.gz)包的一个副本,修改它并安装它;如果你需要使用它,你可以(1)fix() mlogit。或(3)[最好!]联系包维护者,让他们知道问题,并要求他们发布补丁版本...

PS取决于您的通用数据分析协议,您可能希望退出的使用习惯attachWhy is it not advisable to use attach() in R, and what should I use instead?

+1

我大约等于一半的答案。很高兴我没有错,认为这是一种非常不可靠的方法来评估“正确”框架中的论点。 – joran 2012-04-12 16:11:22

+0

伟大的本,非常伟大的一点!我会联系作者!非常感谢! – danfreak 2012-04-12 16:13:39

+0

我还是比我应该/想要在适当的框架中评估公式更舒适/流利,但是'eval(data,parent.frame())'或类似的东西似乎是正确的习惯用法。 。 – 2012-04-12 16:14:07