如何定义一个闭包?

时间:2017-11-07 21:10:00

标签: r

这里我尝试定义一个包含可以调用的函数的闭包:

myFirstClosure <- function (){

  var1 = 1;

  f1 <- function() {
    var1
  }

}

m <- myFirstClosure()
m.f1()

返回错误:Error: could not find function "m.f1"

为什么内部作用域函数f1无法访问,因为我已经定义了外部作用域函数myFirstClosure

更新:

调用像:

这样的闭包是没有意义的
myFirstClosure <- function (){

  var1 = 1;
  var2 = 0;

  f1 <- function() {
    var1
  }

  f2 <- function() {
    var2
  }

}

由于f1f2无法独立调用?

4 个答案:

答案 0 :(得分:6)

.在R中没有意义(除了S3方法调度,但这里没有相关性),以及返回的函数在环境中被称为f1的事实。创建它的函数不会保留。只要您将myFirstClosure()分配给m

m <- myFirstClosure()

它的名字是m而没有别的。您可以使用m()调用它。

如需进一步阅读,我建议Advanced R的功能编程章节。

答案 1 :(得分:3)

您不能使用该表单m.f1(),因为这不是R语法。您可以使用与环境类似的表单。如下所示。

myFirstClosure <- function (){
    var1 <- 1
    e <- environment(myFirstClosure)
    e$f1 <- function() {
        var1
    }
    e
}

m <- myFirstClosure()
m$f1()
#[1] 1

但请注意,myFirstClosure将返回一个环境,而不是一个闭包。这可能会打败你原来的目标 另请参阅An Introduction to R10.7 Scope部分,open.account示例,了解您希望采取的其他方式。

修改
要回答OP的问题编辑,并重复上面的代码,上面的例子可以扩展到任意数量的函数。

myFirstClosure <- function (){
    var1 <- 1
    var2 <- 0
    e <- environment(myFirstClosure)
    e$f1 <- function() {
        var1
    }
    e$f2 <- function() {
        var2
    }
    e
}

m <- myFirstClosure()
m$f1()
#[1] 1

m$f2()
#[1] 0

答案 2 :(得分:2)

这实现了我正在寻找的行为:

myFirstClosure <- function() {

  var1 <- 1;
  var2 <- 0;

  list(f1=function() { 
    var1
  },f2=function() { 
    var2
  })
}

m <- myFirstClosure()
m$f1()
m$f2()

这有助于找到解决方案https://www.r-bloggers.com/using-closures-as-objects-in-r/以及此问题的答案/评论。

答案 3 :(得分:0)

这里最简单的答案是你已经在m本身定义了你的闭包,并且需要简单地调用m

myFirstClosure <- function (){

  var1 = 1;

  f1 <- function() {
    var1
  }

}

m <- myFirstClosure()
m()

我刚刚运行了它,并根据需要输出1

我知道你希望做一些稍微不同的事情 - 你的代码让我想起javascript中的闭包模块模式,你的闭包创建函数输出一个具有多个函数的对象,可以作为属性单独调用,都在创建函数内部的变量上有一个闭包。

我不想说R这是不可能的,但我不知道该怎么做。我很想知道其他评论员是否可以提出建议。

顺便提一下,点到访问属性语法大部分(完全?)在r中不可用 - 通常你会使用$语法,但这也不会在这个实例中起作用。