【问题标题】:R: closure can't find object until calledR:闭包在调用之前找不到对象
【发布时间】:2017-07-18 17:22:17
【问题描述】:

我对 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() 来调用闭包?在范围界定和承诺方面发生了什么?

【问题讨论】:

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


    【解决方案1】:

    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)
    

    【讨论】:

    • @DavidHeckmann:任何作为形式参数传递给函数的对象都会以这种方式表现,而不仅仅是其他函数。查看?force中的示例。
    猜你喜欢
    • 2016-02-19
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多