簡體   English   中英

R-R6-高階函數-封閉函數的范圍

[英]R - R6 - higher order function - scope of enclosing function

我嘗試動態創建R6類的初始化函數。 首先,我創建未鎖定的類定義:

   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”變量時:

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)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM