功能工厂中的强制评估
Force evaluation in function factories
我正在阅读 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
谁能解释一下为什么他在 var
上使用 force
而在 df
上却没有这样做?我知道这样做的目的是强制对变量求值,但不明白为什么他只对 var
.
这样做
行 nrow(df)
将强制计算 df
。由于 var
在内部函数被实际评估之前不会被评估,因此 var
将在闭包中保持未评估的承诺,直到该内部函数实际执行为止。使用 force(var)
强制评估那个承诺。因此,如果您已经以某种方式使用了变量的值,则不需要明确的 force()
。
我正在阅读 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
谁能解释一下为什么他在 var
上使用 force
而在 df
上却没有这样做?我知道这样做的目的是强制对变量求值,但不明白为什么他只对 var
.
行 nrow(df)
将强制计算 df
。由于 var
在内部函数被实际评估之前不会被评估,因此 var
将在闭包中保持未评估的承诺,直到该内部函数实际执行为止。使用 force(var)
强制评估那个承诺。因此,如果您已经以某种方式使用了变量的值,则不需要明确的 force()
。