我在使用 lapply 引导 GLM 时遇到了奇怪的行为。 lapply 的每次迭代都使用不同的权重,但公式变量是相同的。因此,后者被保留在匿名函数之外。
下面是一个可复制的玩具示例。
以下代码按预期运行:
library(dplyr)
data_adult <-read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/adult.csv")
data_adult$Y <- (data_adult$hours.per.week > 40)
est_boot <- lapply(1:10, function(bb){
ff <- as.formula('Y ~ gender')
w <- rexp( nrow(data_adult), 1)
glmout <- glm( ff, 'quasibinomial', data_adult, w )
return(coef(glmout))
})
而以下情况则不然:
ff <- as.formula('Y ~ gender')
est_boot <- lapply(1:10, function(bb){
w <- rexp( nrow(data_adult), 1)
glmout <- glm( ff, 'quasibinomial', data_adult, w )
return(coef(glmout))
})
Error in eval(extras, data, env) : object 'w' not found
我想也许该函数需要在本地定义所有参数。然而,data_adult 则不然。为什么在函数外部定义
w
时无法识别 ff
?
我使用的是 R 4.3.0。
在 R 中,公式有一个名为
.Environment
的属性,您可以通过调用 在第二个版本中看到该属性
attributes(ff)
#> $class
#> [1] "formula"
#>
#> $.Environment
#> <environment: R_GlobalEnv>
解析公式时,
.Environment
属性用作搜索路径的起点来查找它引用的变量。该公式无法找到 w
,因为它在全局环境中不存在。您可以通过将本地环境分配给 .Environment
内的
lapply
属性来解决此问题
ff <- as.formula('Y ~ gender')
est_boot <- lapply(1:10, function(bb){
w <- rexp( nrow(data_adult), 1)
attr(ff, ".Environment") <- environment()
glmout <- glm(ff, 'quasibinomial', data_adult, w )
return(coef(glmout))
})