1

我有一个 R6 类,它基本上是一个类似矩阵的对象的包装器。我想为我的类定义一个方法,让我可以直接索引和子集矩阵的元素。

目前,我的代码如下所示:

cls <- R6Class("cls", public=list(
    initialize=function(...)
    {
        private$mat <- matrix(...)
        private$mat
    }),

    private=list(mat=NULL)
)

"[.cls" <- function(x, ...)
{
    x$.__enclos_env__$private$mat[...]
}

z <- cls$new(1:25, 5, 5)
z[1, 1]
# [1] 1

但是,这需要创建一个顶级[方法,然后直接访问我的类的私有成员。如果可能的话,我想避免这种情况。

我尝试在我的类中添加一个方法,但它不起作用:

cls <- R6Class("cls", public=list(
    initialize=function(...)
    {
        private$mat <- matrix(...)
        private$mat
    },

    "["=function(x, ...)
    {
        "["(private$mat, ...) 
    }),

    private=list(mat=NULL)
)

z[1, 1]
# Error in z[1, 1] : object of type 'environment' is not subsettable

有没有办法在不违反封装的情况下做到这一点?

虽然这适用于 R6,但也欢迎使用参考类的答案。

4

1 回答 1

1

目前,这在 R6 类中是不可能的。

关于这个话题的讨论在: https ://github.com/r-lib/R6/issues/153

于 2019-02-03T09:15:34.170 回答