1

最近我发现自己在 R6 中编写了一些东西,在处理一些对象很有趣的同时,一个有趣的问题出现了。当创建一个私有方法(例如 bar 的 foo)并在其他公共方法中调用它时,如果我使用以下方法调用它,它就会起作用:

self$foo

private$foo

我要问的是:这两种在 R6 中调用方法的方式有什么区别?先感谢您!

4

1 回答 1

3

来自“R6 课程简介”小插图(重点是我的):

self

类的内部方法,self指的是对象。对象的公共成员(到目前为止您所看到的)都可以通过以下方式访问self$x

private

公共成员使用self, like访问self$add()私有成员使用private, like访问private$queue

因此,即使您可以通过 访问私有方法self,您也应该通过private. 不要依赖可能会消失的行为,看看文档如何说它不应该那样工作。

也就是说,我无法使用以下方法访问私有方法self

library(R6)

bar <- R6Class("bar",
  private = list(
    foo = function() {
      message("just foo it")
    }
  ),
  public = list(
    call_self = function() {
      self$foo()
    },
    call_private = function() {
      private$foo()
    }
  )
)

b <- bar$new()
b$call_private()
# just foo it
b$call_self()
# Error in b$call_self() : attempt to apply non-function
于 2017-12-06T17:02:17.483 回答