R - R6 - 高阶函数 - 封闭函数的作用域
R - R6 - higher order function - scope of enclosing function
我尝试动态创建 R6 的初始化函数 class。
首先我创建解锁 class 定义:
cls <- R6::R6Class(
name,
inherit=TPayload,
lock_objects=FALSE,
public=list(
module=class(tail(Parser$thrift_stack, 1)[[1]])[[1]],
ttype=ttype
))
在我添加初始化函数后的某处:
cls$set("public", 'initialize', init_func_generator(cls, default_spec))
其中 init_func_generator:
init_func_generator = function(cls, spec) {
func = function(...) {
cat('Hello\n')
}
return(func)
}
创建对象时执行简单的初始化函数有效。
cli$new(name='abc')
然而,当我尝试从创建的范围之外访问 'spec' 变量时 'initialize':
init_func_generator = function(cls, spec) {
func = function(...) {
for(s in spec) {
cat(str(s))
}
}
return(func)
}
我得到:
* object 'spec' not found
有可能实现我想要实现的目标吗?
我重写了我的解决方案:
init_func_generator = function(cls, spec) {
if(length(spec) == 0) return(function() { })
args <- alist()
for(s in spec) {
args[[s[[1]]]] <- s[[2]]
}
func <- function() {
argg <- as.list(environment())
for(arg_name in names(argg)) {
self[[arg_name]] <- argg[[arg_name]]
}
}
formals(func) <- args
return(func)
}
所以现在我可以做:
print(s$Set$new(a_set=1)$a_set)
[1] 1
print(s$Set$new()$a_set)
[1] NA
当本例中的规格为 [('a_set', NA)]
我尝试动态创建 R6 的初始化函数 class。 首先我创建解锁 class 定义:
cls <- R6::R6Class(
name,
inherit=TPayload,
lock_objects=FALSE,
public=list(
module=class(tail(Parser$thrift_stack, 1)[[1]])[[1]],
ttype=ttype
))
在我添加初始化函数后的某处:
cls$set("public", 'initialize', init_func_generator(cls, default_spec))
其中 init_func_generator:
init_func_generator = function(cls, spec) {
func = function(...) {
cat('Hello\n')
}
return(func)
}
创建对象时执行简单的初始化函数有效。
cli$new(name='abc')
然而,当我尝试从创建的范围之外访问 'spec' 变量时 'initialize':
init_func_generator = function(cls, spec) {
func = function(...) {
for(s in spec) {
cat(str(s))
}
}
return(func)
}
我得到:
* object 'spec' not found
有可能实现我想要实现的目标吗?
我重写了我的解决方案:
init_func_generator = function(cls, spec) {
if(length(spec) == 0) return(function() { })
args <- alist()
for(s in spec) {
args[[s[[1]]]] <- s[[2]]
}
func <- function() {
argg <- as.list(environment())
for(arg_name in names(argg)) {
self[[arg_name]] <- argg[[arg_name]]
}
}
formals(func) <- args
return(func)
}
所以现在我可以做:
print(s$Set$new(a_set=1)$a_set)
[1] 1
print(s$Set$new()$a_set)
[1] NA
当本例中的规格为 [('a_set', NA)]