这里我尝试定义一个包含可以调用的函数的闭包:
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
}
}
由于f1
和f2
无法独立调用?
答案 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 R,10.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中不可用 - 通常你会使用$
语法,但这也不会在这个实例中起作用。