我正在阅读Hadley的Advanced R,并进入此示例:
boot_permute <- function(df, var) {
n <- nrow(df)
force(var)
function() {
col <- df[[var]]
col[sample(n, replace = TRUE)]
}
}
boot_mtcars1 <- boot_permute(mtcars, "mpg")
head(boot_mtcars1())
#> [1] 16.4 22.8 22.8 22.8 16.4 19.2
head(boot_mtcars1())
#> [1] 17.8 18.7 30.4 30.4 16.4 21.0
[谁能解释我为什么他在force
上使用var
但对df
却没有做同样的事情?我知道我的目的是强制对变量进行求值,但为什么他只为var
才做就无法理解。
nrow(df)
行将强制评估df
。由于在实际计算内部函数之前不会评估var
,因此在实际执行该内部函数之前,var
将在闭包内保持未评估的承诺。使用force(var)
强制对该承诺进行评估。因此,如果您已经以某种方式使用了变量的值,则不需要显式的force()
。