错误:嵌套函数中的"找不到对象"

tna*_*ake 3 r function logistf

我正在使用logistf::logistflogistf::forward函数编写函数.我会在这里给使用最少的工作示例sex2logistf包.

data(sex2)
fwSel <- function(datamod) {
  fitnull <- logistf(case ~ 1, data = datamod, pl = FALSE) 
  fw <- forward(fitnull)
  return(fw)
}
fwSel(sex2)
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

第0步:开始模型

is.data.frame(data)出错:找不到对象'datamod'.

对此有任何解释吗?

Lyz*_*deR 6

这是一个典型的错误,你可以在R中得到它.它已被再次询问,不幸的是它根据不同功能在不同环境中的工作方式以及函数如何根据parent.env或使用来查找数据parent.frame.这可能是两个问题之一:

  • 延迟评估问题:
    尝试force(datamod)在您的logistf函数之前使用,因为您的自定义函数当前未评估您的数据进程.如果存在以下问题,则可能无效:
  • 您的数据存储数据集存在于函数的执行环境中.如果函数链中的一个函数使用对a parent.frame()或call的调用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)
Run Code Online (Sandbox Code Playgroud)

这肯定会有效,因为无论如何都会搜索全球环境.

我发现这个链接是一种很好的方式,可以找出它们的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>
Run Code Online (Sandbox Code Playgroud)

正如您在上面看到的那样,使用get调用环境可以正常工作,而使用get父环境会失败并产生错误.这也是(可能)在你的函数中发生的事情.