- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面显示的 R 代码是一个最小的工作示例,用于重现我不能说我理解的错误。运行脚本应该会产生错误,Error in eval(expr, envir, enclos) : could not find function "fitModel"
.在 environments 上阅读一两件事后我想我明白为什么在这种情况下会发生这种情况,“fitModel”没有在“obscureFunction”的执行环境中定义。我通过对“myFormula”进行以下更改来修复此问题: myFormula <- "y ~ eval(fitModel(x, a), envir = environment(fitModel))"
当在“obscureFunction”的调用环境中找不到函数时,我不明白如何在“fitModel”的环境中评估“fitModel”,换句话说,我不明白为什么这段代码改变作品。我也不明白为什么如果“topFunction”的主体在不调用它的情况下运行,原始代码就可以正常工作,即如果我们在 R_GlobalEnv
中定义“fitModel”和“obscureFunction”并从控制台调用“obscureFunction”。
## Minimum Working Example to reproduce error
rm(list = ls())
library(minpack.lm)
topFunction <- function(){
fitModel <- function(x, a){
exp(-a * x)
}
## Create a function to use with lapply()
obscureFunction <- function(){
x <- seq(-1, 1, 0.01)
y <- exp(-0.5 * x)
Data <- data.frame(x, y)
init <- c(a = 1)
myFormula <- "y ~ fitModel(x, a)"
myFormula <- as.formula(myFormula)
nlsOutput <- nlsLM(formula = myFormula, start = init, data = Data)
return(nlsOutput)
}
## Function call
obscureFunction()
## Other calculations done with fitModel()
}
topFunction()
最佳答案
嗯,这里有两个问题。第一种是使用字符串作为公式。最好用
myFormula <- y ~ fitModel(x, a)
原因是公式会捕获它们的环境,而字符串不会。 (正如@BridieG 所指出的,as.formula()
将捕获环境;我在阅读代码时跳过了该行。我仍然认为直接创建公式更好。)环境使查找公式中使用的函数变得更加容易。因此,如果您使用的是 lm()
而不是 nlsLM
,这将适用于这两个更改
# 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)
这适用于公式语法(未加引号的变量名称)而不是字符串,因为公式可以捕获环境。
至少它应该是这样的。程序包作者可以随意评估公式,nlsLM()
函数的作者决定忽略分配给公式的环境。他们在 nlsLM()
FCT <- function(par) {
mf[m] <- par
rhs <- eval(formula[[3L]], envir = mf)
res <- lhs - rhs
res <- .swts * res
res
}
所以这是第二个问题。在这里,他们在 mf
对象中强制执行评估,该对象是由数据的协变量和参数估计组成的 data.frame。如果写成
rhs <- eval(formula[[3L]], envir = mf, environment(formula))
它会奏效的。这基本上就是 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)))
然后进行这些替换
# 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
因此,关于所有 R 函数如何处理环境和作用域,您并没有太多可说的。此行为对于 nlsLM()
作者决定评估其参数的方式而言是独一无二的。
关于r - eval(expr, envir, enclos) 错误 : could not find function - Nested Functions & Environments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30089698/
编辑以提供完整的代码示例和特定问题 我正在编写一个函数来生成股票价格的时间序列图。但是,出现以下错误 eval(expr,envir,enclos)中的错误:找不到对象'df1234' 这是该函数的示
我不明白这里出了什么问题。 data.train <- read.table("Assign2.WineComplete.csv",sep=",",header=T) # Building decis
我不明白这里出了什么问题。 data.train 。您需要更改公式或数据框,使它们彼此一致。 澄清一下:Pre 是一个包含公式的对象。该公式包含对变量 pre 的引用。后者必须与数据框一致。 关于r
我正在解决 Kaggle 数字识别器问题。当我尝试给定的代码时,出现错误。 eval(expr,envir,enclos)中的错误:找不到函数“eval” library(ggplot2) libra
当我尝试“编织 HTML”或使用 LyX 生成 pdf 时,我遇到了环境问题。当我直接运行 R 代码(或用 Rstudio 编译 HTML 笔记本)时,没问题。我已经用 knitr@1.3.7(开发版
我尝试将geom_ribbon对象添加到我的ggplot2图中。在我的数据框中,我有NA值(我想)可能会引起问题。这是我拥有的数据帧的可复制示例: base <- c(1:10, rep(NA, 10
我基于 kind help 在 R 中创建了一个函数来自@Jim M。 当我运行该函数时,出现错误:错误:未知列“原始数据” 查看调试器时,我收到消息: Rcpp::eval(expr, envir,
我试图复制 ggplot2 书第 86 页上 Hadley Wickham 的例子,在那里他覆盖了 geom_rects,显示执政党对失业趋势的影响。这是我的核心代码,包含一些示例数据: librar
我不明白为什么我的极简封装函数会产生主题错误。下面应该重现它。我的目标是根据单个数据框中的数据绘制一堆图,每个图都位于一个新窗口中。 library(ggplot2) library(datasets
下面显示的 R 代码是一个最小的工作示例,用于重现我不能说我理解的错误。运行脚本应该会产生错误,Error in eval(expr, envir, enclos) : could not find
下面显示的 R 代码是一个最小的工作示例,用于重现我不能说我理解的错误。运行脚本应该会产生错误,Error in eval(expr, envir, enclos) : could not find
当使用带有 boost/regex 的 Rcpp 时,Build&reload 显示 Error in eval(expr, envir, enclos) : object 'libboost_reg
我是一名优秀的程序员,十分优秀!