R:闭包在找到之前无法找到对象

时间:2017-02-27 22:23:59

标签: r function functional-programming closures higher-order-functions

我在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

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

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

在新环境中使用闭包之前,如何避免在全局环境中使用mod()调用闭包?在范围和承诺方面,这里发生了什么?

1 个答案:

答案 0 :(得分:2)

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)