eval(expr、envir、enclose)中出错:找不到函数-嵌套函数&;环境

eval(expr、envir、enclose)中出错:找不到函数-嵌套函数&;环境,r,R,下面显示的R代码是一个最小的工作示例,用于重现一个我不能说我理解的错误。运行脚本会产生错误,error in eval(expr、envir、enclose):找不到函数“fitModel”。在阅读了一两篇文章之后,我想我理解了为什么在这种情况下会发生这种情况,“fitModel”没有在“obclustefunction”的执行环境中定义。我通过对“myFormula”进行以下更改来修复此问题: myFormula这里有两个问题。第一种是使用字符串作为公式。最好用 myFormula <-

下面显示的R代码是一个最小的工作示例,用于重现一个我不能说我理解的错误。运行脚本会产生错误,
error in eval(expr、envir、enclose):找不到函数“fitModel”
。在阅读了一两篇文章之后,我想我理解了为什么在这种情况下会发生这种情况,“fitModel”没有在“obclustefunction”的执行环境中定义。我通过对“myFormula”进行以下更改来修复此问题:
myFormula这里有两个问题。第一种是使用字符串作为公式。最好用

myFormula <- y ~ fitModel(x, a)
这适用于公式语法(无引号的变量名称),而不是字符串,因为公式可以捕获环境

至少它应该是这样工作的。包作者可以自由地根据自己的意愿评估公式,而
nlsLM()
函数的作者决定忽略分配给公式的环境。它们在
nlsLM()内的函数中执行此操作

这会奏效的。这基本上就是
model.frame()
lm()
中所做的,它允许这种方法工作。我们可以使用

# tested with minpack.lm_1.1-8
nlsLM2<-nlsLM
body(nlsLM2)[[27]][[3]][[3]][[3]]<-quote(rhs<-eval(formula[[3L]], envir = mf, environment(formula)))

因此,对于所有R函数如何处理环境和作用域,您并没有什么可说的。这种行为是
nlsLM()
作者决定评估其参数时所特有的。

注意,这适用于字符公式,后面跟着
as.formula
,因为第二步附加了环境(+1)Good point@BrodieG。(但我仍然认为最好跳过这一步,从一开始就制定一个合适的公式)。谢谢@MrFlick,你的解决方案在我这边也有效。我也没有想到创建R函数的修改版本,所以现在我开始尝试对nlsLM进行其他一些修改。@BrodieG确实如此。编辑的评论。
# myFormula <- "y ~ fitModel(x, a)"  ... becomes
myFormula <- y ~ fitModel(x, 1)

#nlsOutput <- nlsLM(formula = myFormula, start = init, data = Data) ...becomes
nlsOutput <- lm(formula = myFormula, data = Data)
FCT <- function(par) {
    mf[m] <- par
    rhs <- eval(formula[[3L]], envir = mf)
    res <- lhs - rhs
    res <- .swts * res
    res
}
rhs <- eval(formula[[3L]], envir = mf, environment(formula))
# tested with minpack.lm_1.1-8
nlsLM2<-nlsLM
body(nlsLM2)[[27]][[3]][[3]][[3]]<-quote(rhs<-eval(formula[[3L]], envir = mf, environment(formula)))
# myFormula <- "y ~ fitModel(x, a)"  ... becomes
myFormula <- y ~ fitModel(x, a)

#nlsOutput <- nlsLM(formula = myFormula, start = init, data = Data) ...becomes
nlsOutput <- nlsLM2(formula = myFormula, start = init, data = Data) 
Nonlinear regression model
  model: y ~ fitModel(x, a)
   data: Data
  a 
0.5 
 residual sum-of-squares: 0

Number of iterations to convergence: 5 
Achieved convergence tolerance: 1.49e-08