我正在使用logistf::logistf
和logistf::forward
函数编写函数。我将使用sex2
包中的logistf
给出最小的工作示例。
data(sex2)
fwSel <- function(datamod) {
fitnull <- logistf(case ~ 1, data = datamod, pl = FALSE)
fw <- forward(fitnull)
return(fw)
}
fwSel(sex2)
我得到以下输出:
第0步:启动模型
is.data.frame(data)中的错误:object&#39; datamod&#39;没找到。。
有人对此有解释吗?
答案 0 :(得分:5)
这是您可以在R中获得的典型错误。已经再次询问它,不幸的是,它根据不同功能在不同环境中的工作方式以及函数如何根据parent.env
的使用情况尝试查找数据而发生或parent.frame
。这可能是两个问题之一:
force(datamod)
函数之前使用logistf
,因为您的自定义函数中当前未评估您的数据片。如果存在以下问题,则可能无效:parent.frame()
的调用或对parent_env()
的调用,这会导致问题,因为R在不同环境中查找数据的方式不同。解决这个问题的唯一方法是在全球环境中启动数据仓,即:
data(sex2)
datamod <- sex2
fwSel <- function(datamod) {
fitnull <- logistf(case ~ 1, data = datamod, pl = FALSE)
fw <- forward(fitnull)
return(fw)
}
fwSel(sex2)
这肯定会有效,因为无论如何都会搜索全球环境。
我发现这个link是了解parent.env
与parent.frame
的不同之处的绝佳方式,以及如何使用这两个内部函数可能会导致问题,例如您所面临的问题。
我根据链接中的函数创建了一个新示例,它完全展示了您的问题:
f = function() {
print(c(f=environment(), defined_in=parent.env(environment()),
called_from=parent.frame()))
#search for mydata in calling environment
try(print(get('mydata',env=parent.frame())))
#search for mydata in parent evnironment
try(print(get('mydata',env=parent.env(environment()))))
}
g = function() {
mydata <- c(1,2,3)
print(c(g=environment(), f()))
}
> g()
$f
<environment: 0x0000000030868df8>
$defined_in
<environment: R_GlobalEnv>
$called_from
<environment: 0x000000003086a360>
#the first get works perfect
[1] 1 2 3
#the second produces an error
Error in get("mydata", env = parent.env(environment())) :
object 'mydata' not found
$g
<environment: 0x000000003086a360>
正如您在上面使用get
看到调用环境有效,而在父环境中使用get
失败并产生错误。这也是(可能)在您的函数中发生的事情。