R 从另一个函数内部调用mlogit(),使用attach时变量的作用域问题

R 从另一个函数内部调用mlogit(),使用attach时变量的作用域问题,r,scoping,mlogit,R,Scoping,Mlogit,我需要从另一个函数内部调用 这是一个用于演示目的的函数: #------------------------- # DEMO FUNCTION #------------------------- # f = formula (string) # fData = data.frame # cVar = choice variable (string) # optVar = alternative variable (string) ########################## mlogi

我需要从另一个函数内部调用

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

#-------------------------
# 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))
}
#-------------------------
#演示功能
#-------------------------
#f=公式(字符串)
#fData=data.frame
#cVar=选择变量(字符串)
#optVar=可选变量(字符串)
##########################

mlogitSumtl;dr这似乎是
mlogit
中的一个bug,您可以自己修复(见下文)或请维护人员修复

mlogit
的内部深处,函数尝试按如下方式计算数据:

nframe <- length(sys.calls()) ## line 11
... 
data <- eval(mldata, sys.frame(which = nframe))  ## line 44
之后,代码似乎起了作用

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


PS根据您的通用数据分析协议,您可能希望摆脱使用
附加

tl的习惯;dr这似乎是
mlogit
中的一个bug,您可以自己修复(见下文)或请维护人员修复

mlogit
的内部深处,函数尝试按如下方式计算数据:

nframe <- length(sys.calls()) ## line 11
... 
data <- eval(mldata, sys.frame(which = nframe))  ## line 44
之后,代码似乎起了作用

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


PS根据您的通用数据分析协议,您可能希望摆脱使用
附件的习惯:

您的第一个示例为我运行。您能否更具体地说明您的问题?您是否愿意编辑您的问题,而不是将更新/更正的版本保留在评论中?如果问题是在
mlogit
(哪个版本?)中修复错误一年后提出的,则应关闭该问题。我似乎不能。如果它是关于函数内部的
attach()
的危险,那么它有许多重复之处:您的第一个示例适用于我。您能否更具体地说明您的问题?您是否愿意编辑您的问题,而不是将更新/更正的版本保留在评论中?如果问题是在
mlogit
(哪个版本?)中修复错误一年后提出的,则应关闭该问题。我似乎不能。如果它是关于函数内部的
attach()
的危险,那么它有许多重复的地方:我大概已经给出了一个相同的答案。很高兴我认为这是一种在“正确”框架中计算参数的非常不可靠的方法,我没有错。在适当的框架中计算公式时,我仍然比我应该/希望的要不舒服/流利得多,但是
eval(data,parent.frame())
或类似的成语似乎总的来说是正确的……我大概已经给出了一个类似的答案。很高兴我认为在“正确”的框架中计算参数是一种非常不可靠的方法,我没有错。在适当的框架中计算公式时,我仍然比我应该/希望的要不舒服/流利得多,但是
eval(data,parent.frame())
或类似的方法通常似乎是正确的习惯用法。。。
#-------------------------
# 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)
nframe <- length(sys.calls()) ## line 11
... 
data <- eval(mldata, sys.frame(which = nframe))  ## line 44
data <- eval(mldata, parent.frame())