lapply 和具有不同作用域的函数参数

问题描述 投票:0回答:1

我在使用 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 lapply glm
1个回答
2
投票

在 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))
})
© www.soinside.com 2019 - 2024. All rights reserved.