首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用闭包生成R6绑定

使用闭包生成R6绑定
EN

Stack Overflow用户
提问于 2016-03-02 20:39:52
回答 1查看 539关注 0票数 1

我在R6类中使用活动绑定来检查赋值给字段之前的值。我想我可以使用一个闭包来生成如下所示的绑定,但这是行不通的。

绑定没有按我预期的方式进行评估(完全没有?)因为错误显示闭包的name参数。我遗漏了什么?

代码语言:javascript
复制
library(R6)
library(pryr)

# pass a field name to create its binding 
generate_binding <- function(name) {
  function(value) {
    if (!missing(value) && length(value) > 0) {
      private$name <- value
    } 
    private$name
  }
}

bind_x = generate_binding(x_)
# created as intended:
unenclose(bind_x)
# function (value) 
# {
#     if (!missing(value) && length(value) > 0) {
#         private$x_ <- value
#     }
#     private$x_
# }

MyClass <- R6::R6Class("MyClass",
  private = list(
    x_ = NULL
  ),
  active = list(
    x = bind_x
  ),
)

my_class_instance <- MyClass$new()
my_class_instance$x <- "foo"
# Error in private$name <- value :
#   cannot add bindings to a locked environment
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-03 10:44:13

我想你误解了闭包是如何工作的。unenclose在这里是一只红鲱鱼(因为它实际上并没有向您展示闭包是什么样子)。闭包包含语句private$name <- value - it不包含语句private$x_ <- value

这个问题的通常解决方案是重写闭包,以便将未计算的name参数分离到其字符串表示中,然后用于子集private环境(private[[name]] <- value)。但是,这在这里不起作用,因为R6活动绑定分离了封闭环境的闭包。

这就是unenclose出现的原因:

代码语言:javascript
复制
MyClass <- R6::R6Class("MyClass",
  private = list(
    x_ = NULL
  ),
  active = list(
    x = pryr::unenclose(bind_x)
  ),
)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35757619

复制
相关文章

相似问题

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