函数工厂中的强制求值

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

我正在阅读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才做就无法理解。

r lazy-evaluation
1个回答
2
投票

nrow(df)行将强制评估df。由于在实际计算内部函数之前不会评估var,因此在实际执行该内部函数之前,var将在闭包内保持未评估的承诺。使用force(var)强制对该承诺进行评估。因此,如果您已经以某种方式使用了变量的值,则不需要显式的force()

© www.soinside.com 2019 - 2024. All rights reserved.