error: 'object not found' in nested functions
error: 'object not found' in nested functions
我正在使用 logistf::logistf
和 logistf::forward
函数编写一个函数。我将在这里给出一个使用 logistf
包中的 sex2
的最小工作示例。
data(sex2)
fwSel <- function(datamod) {
fitnull <- logistf(case ~ 1, data = datamod, pl = FALSE)
fw <- forward(fitnull)
return(fw)
}
fwSel(sex2)
我得到以下输出:
Step 0 : starting model
Error in is.data.frame(data) : object 'datamod' not found`.
有人对此有解释吗?
这是您在 R 中可能遇到的典型错误。它已被再次询问,不幸的是,它是根据不同函数在不同环境中的工作方式以及函数如何根据 [=12 的使用尝试查找数据而发生的=] 或 parent.frame
。这可能是以下两个问题之一:
- 惰性求值问题:
尝试在 logistf
函数之前使用 force(datamod)
,因为您的 datamod 当前未在您的自定义函数中求值。如果存在以下问题,这可能不起作用:
- 您的 datamod 数据集存在于您函数的执行环境中。如果函数链中的函数之一使用对
parent.frame()
的调用或对 parent_env()
的调用,这将导致问题,因为 R 在不同环境中查找数据的方式不同.解决这个问题的唯一方法是在全局环境中启动 datamod 即:
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
有何不同以及使用这两个内部函数如何导致像你这样的问题的好方法面对.
我根据 link 中的函数制作了一个新示例,它准确地演示了您的问题:
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
会失败并产生错误。这也是(可能)在您的函数中发生的事情。
我正在使用 logistf::logistf
和 logistf::forward
函数编写一个函数。我将在这里给出一个使用 logistf
包中的 sex2
的最小工作示例。
data(sex2)
fwSel <- function(datamod) {
fitnull <- logistf(case ~ 1, data = datamod, pl = FALSE)
fw <- forward(fitnull)
return(fw)
}
fwSel(sex2)
我得到以下输出:
Step 0 : starting model
Error in is.data.frame(data) : object 'datamod' not found`.
有人对此有解释吗?
这是您在 R 中可能遇到的典型错误。它已被再次询问,不幸的是,它是根据不同函数在不同环境中的工作方式以及函数如何根据 [=12 的使用尝试查找数据而发生的=] 或 parent.frame
。这可能是以下两个问题之一:
- 惰性求值问题:
尝试在logistf
函数之前使用force(datamod)
,因为您的 datamod 当前未在您的自定义函数中求值。如果存在以下问题,这可能不起作用: - 您的 datamod 数据集存在于您函数的执行环境中。如果函数链中的函数之一使用对
parent.frame()
的调用或对parent_env()
的调用,这将导致问题,因为 R 在不同环境中查找数据的方式不同.解决这个问题的唯一方法是在全局环境中启动 datamod 即:
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
有何不同以及使用这两个内部函数如何导致像你这样的问题的好方法面对.
我根据 link 中的函数制作了一个新示例,它准确地演示了您的问题:
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
会失败并产生错误。这也是(可能)在您的函数中发生的事情。