【问题标题】:Object not found when called within a function with a formula在使用公式的函数中调用时找不到对象
【发布时间】:2014-05-20 21:16:50
【问题描述】:

我正在尝试从另一个接受公式作为参数的函数中调用 checkm 函数。我收到一个找不到对象的错误。这是最小的实现和错误。

library(lrmest)
data(pcd)
form<-formula(Y~X1+X2+X3+X4)
checkm(form,data=pcd)


Wrap<-function(f){
  checkm(f,data=pcd)
}

Wrap(form)

错误是:

Error in model.frame(formula = f, data = pcd, NULL) : 
  object 'f' not found
Called from: eval(expr, envir, enclos)

我通过阅读的猜测是这与我不了解环境或承诺有关,但鉴于我不了解它们,我可能错了。

有什么快速解决办法吗?

【问题讨论】:

  • 可能是 lrmest 作者的一些草率编码,而不是您的错误。在checkm 内部,他们使用eval(cal) 而不是eval(cal,parent.frame())

标签: r


【解决方案1】:

一种快速解决方法是更改​​公式参数的名称。它恰好与checkm 中的eval(cal) 调用冲突。我怀疑@joran 是对的,这不是你的错。这有效:

library(lrmest)
data(pcd)
form<-Y~X1+X2+X3+X4
checkm(form,data=pcd)


Wrap<-function(formula){
  checkm(formula,data=pcd)
}

Wrap(form)

【讨论】:

    【解决方案2】:

    正如@joran 指出的那样,由于未使用正确的框架来评估命令,函数中存在错误/错误。如果你将checkm 换成lm,你会发现它运行得很好。您可以创建自己的函数,只更改那一行代码

    checkm2<-checkm
    body(checkm2)[[6]]<-quote(cal <- eval(cal, parent.frame()))
    

    然后运行

    library(lrmest)
    data(pcd)
    form<-formula(Y~X1+X2+X3+X4)
    checkm2(form,data=pcd)
    
    
    Wrap<-function(f){
      checkm2(f,data=pcd)
    }
    
    Wrap(form)
    

    一切似乎都运行正常。所以这似乎是编写代码的人的错。您可以考虑联系他们提交错误报告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多