R:闭包在调用之前找不到对象

R: closure can't find object until called

我对 R 中的高阶函数有疑问:

power <- function(x , modify){
  return(
      function(y){
         return(  modify( y^x ) )
      }
  )
}

mod <- function(z){z+1}

sq <- power(x = 2,modify =  mod  )

# remove the function that was passed to `power()`, I expect it to be saved in the function environment:

rm(mod)

sq(2)
# Error in sq(2) : object 'mod' not found

但是,如果我在删除 mod() 之前以某种方式调用 sq(),问题就不会发生,但我会收到警告 "In sq(2) : restarting interrupted promise evaluation":

mod <- function(z){z+1}
sq(2)
rm(mod)
sq(2)

如何避免在新上下文中使用闭包之前必须调用在全局环境中定义的 mod() 的闭包?在范围界定和承诺方面发生了什么?

modify 是一个在函数被调用之前不会被评估的承诺。您可以使用 force 来评估形式论证。

power <- function(x , modify){
  force(modify)
  return(
      function(y){
         return(  modify( y^x ) )
      }
  )
}
mod <- function(z){z+1}
sq <- power(x = 2,modify =  mod  )
rm(mod)
sq(2)
# [1] 5

来自 ?force 的注意事项,您实际上不需要使用 force。您可以简单地评估符号以获得相同的效果。

power <- function(x , modify){
  modify
  return(
      function(y){
         return(  modify( y^x ) )
      }
  )
}
mod <- function(z){z+1}
sq <- power(x = 2,modify =  mod  )
rm(mod)
sq(2)