【问题标题】:Force evaluation in function factories函数工厂中的力评估
【发布时间】:2019-12-02 05:09:33
【问题描述】:

我正在阅读 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 这样做。

【问题讨论】:

    标签: r lazy-evaluation


    【解决方案1】:

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

    【讨论】:

    • 谢谢!另一个问题,如果我用任何其他函数替换nrowdf 变量仍然适用吗?
    • 嗯,不,不是 any 其他功能。您必须保证该函数将评估参数。使用非标准评估的函数可能不会评估变量。但大多数功能可能会起作用。如果你想安全,使用force()
    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多