首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R- R6 -高阶函数-封闭函数的作用域

R- R6 -高阶函数-封闭函数的作用域
EN

Stack Overflow用户
提问于 2018-03-05 07:25:50
回答 1查看 129关注 0票数 1

我尝试动态创建R6类的初始化函数。首先,我创建未锁定的类定义:

代码语言:javascript
运行
复制
   cls <- R6::R6Class(
       name,
       inherit=TPayload,
       lock_objects=FALSE,
       public=list(
           module=class(tail(Parser$thrift_stack, 1)[[1]])[[1]],
           ttype=ttype
       ))

在我添加了一个初始化函数之后:

代码语言:javascript
运行
复制
cls$set("public", 'initialize', init_func_generator(cls, default_spec))

其中init_func_generator:

代码语言:javascript
运行
复制
init_func_generator = function(cls, spec) {    
  func = function(...) {
    cat('Hello\n')
  }

  return(func)
}

当我创建一个对象时,执行简单的初始化函数会起作用。

代码语言:javascript
运行
复制
cli$new(name='abc')

然而,当我试图从创建的‘initialize’作用域之外访问'spec‘变量时:

代码语言:javascript
运行
复制
init_func_generator = function(cls, spec) {    
  func = function(...) {
    for(s in spec) {
      cat(str(s))
    }
  }

  return(func)
}

我得到了:

代码语言:javascript
运行
复制
* object 'spec' not found

有没有可能实现我想要实现的目标?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-05 14:03:47

我重写了我的解决方案:

代码语言:javascript
运行
复制
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)
}

所以现在我可以这样做:

代码语言:javascript
运行
复制
  print(s$Set$new(a_set=1)$a_set)
  [1] 1

  print(s$Set$new()$a_set)
  [1] NA

当本例中的规范为('a_set',NA)时

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49101593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档