在R6类上定义一个括号(`[`)运算符

这是不起作用的:

library(R6)

Foo = R6::R6Class(
    'Foo',
    public = list(
        X = NULL,
        metadata = NULL,
        initialize = function(X, metadata){
            self$X = X
            self$metadata = metadata
        },
        `[` = function(selection){
            subfoo = Foo$new(X = X[selection], 
                             metadata = self$metadata)
            return(subfoo)
        }
    )
)

具体来说,[方法是垃圾:

> X = matrix(1:8, ncol = 2)
> foo = Foo$new(X, 'blah blah')
> foo[1:2,]
Error in foo[1:2, ] : object of type 'environment' is not subsettable

期望的结果是foo [1:2,]将像Foo一样成为类Foo的对象,除了它的矩阵foo $X更小.有没有直接的方法来实现这个直接向用户公开[操作符?

最佳答案 答案迟到总比我想象的要好.问题是你正在注册可以调用的方法

x$`[`(1:3)

而你想要的

x[1:3]

以下将为所有R6对象正确地调度所有[和[& – ; – 调用(通过S3)).

`[.R6` <- function(x, ...) x$`[`(...) 
`[<-.R6` <- function(x, ...) x$`[<-`(...) 

请注意,对于[[方法,因为这些已经定义和使用,因为R6对象是环境,所以不应该这样做.

理想情况下,如果(也可以覆盖以便我们可以创建仿函数对象(例如调用x(2)),那将是很好的,但我不知道如何做到这一点..

点赞