功能工厂中的强制评估

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()