R - R6 - 高阶函数 - 封闭函数的范围

时间:2018-03-04 23:25:50

标签: r r6

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

componentWillMount() {   
   this.props.actions.loadPropImages();
}

function mapDispatchToProps(dispatch) {
  return {
    actions: bindActionCreators(imageActions, dispatch) 
  };
}

export default connect(mapStateToProps, mapDispatchToProps)(EditorPage);

在我添加初始化函数之后的某个地方:

   cls <- R6::R6Class(
       name,
       inherit=TPayload,
       lock_objects=FALSE,
       public=list(
           module=class(tail(Parser$thrift_stack, 1)[[1]])[[1]],
           ttype=ttype
       ))

其中init_func_generator:

cls$set("public", 'initialize', init_func_generator(cls, default_spec))

执行简单初始化函数时,我创建了一个对象。

init_func_generator = function(cls, spec) {    
  func = function(...) {
    cat('Hello\n')
  }

  return(func)
}

然而,当我尝试访问&#39; spec&#39;来自创建的外部范围的变量&#39; initialize&#39;:

cli$new(name='abc')

我明白了:

init_func_generator = function(cls, spec) {    
  func = function(...) {
    for(s in spec) {
      cat(str(s))
    }
  }

  return(func)
}

我可以尝试实现吗?

1 个答案:

答案 0 :(得分:0)

我改写了我的解决方案:

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

当这种情况下的规格是[(&#39; a_set&#39;,NA)]

相关问题