1

フィールドに割り当てる前に値をチェックするために、R6 クラスでアクティブ バインディングを使用しています。以下のようにクロージャーを使用してバインディングを生成できると考えましたが、これは機能しません。

nameエラーがクロージャーの引数を示しているため、バインディングは期待どおりに評価されません (まったく?) 。私は何が欠けていますか?

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
4

1 に答える 1