subset_base
是以r为基的subset()
函数的简单形式.本例取自高级R第20.6.1章.
此函数本身运行良好:
subset_base <- function(data, rows) {
rows <- substitute(rows)
rows_val <- eval(rows, data, parent.frame())
data[rows_val, , drop = FALSE]
}
my_df <- data.frame(x = 1:3)
subset_base(my_df, x == 1)
#> x
#> 1 1
然而,当我们构建包装器函数apply_subset
时,在该包装器函数中定义一些值zzz
,并在subset_base
上调用lapply()
(在同一函数中),提供zzz
作为参数,但找不到.
我想更好地理解为什么找不到zzz
个.我的心理模型是这样的:lapply
调用subset_base
,而apply_subset
调用subset_base
.在subset_base
中,我们计算提供的data.frame
data
中的rows
参数,该参数将自动转换为环境.该环境由调用环境parent.frame()
封装.这应该是lapply
的执行环境.我想这个环境又是以lapply
的调用环境为父的.这将是apply_subset
的执行环境.但情况似乎并非如此,因为如果这是真的,那么应该找到zzz
个.
apply_subset <- function(){
zzz <- 2
dfs <- list(data.frame(x = 1:3), data.frame(x = 4:6))
lapply(dfs, FUN = subset_base, x == zzz)
}
apply_subset()
#> Error in eval(rows, data, parent.frame()): object 'zzz' not found
更奇怪的是,当我们从直接提供subset_base
作为对象/函数名更改为调用lapply
,并将其包装到匿名函数中时,可以找到zzz
.
apply_subset2 <- function(){
zzz <- 2
dfs <- list(data.frame(x = 1:3), data.frame(x = 4:6))
lapply(dfs, FUN = \(df) subset_base(df, x == zzz))
}
apply_subset2()
#> [[1]]
#> x
#> 2 2
#>
#> [[2]]
#> [1] x
#> <0 rows> (or 0-length row.names)
创建于2024-01-27,共reprex v2.0.2个
我非常希望解释一下(1)调用堆栈中每个执行环境的父环境是什么,(2)为什么我认为它们是一致的,显然是错误的,以及(3)当对lapply
的调用使用匿名函数时,为什么这种情况会改变.此外,如果知道(4)是否有任何方法可以在不使用匿名函数的情况下使lApply调用工作(Advanced R似乎建议(可能)唯一的解决方案是使用Rangs Quosures),那将是非常好的.