以下是不起作用的地方:
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
更小。是否有一种直接实现此操作的方法可以直接向用户公开[
操作符?
发布于 2018-08-28 13:15:31
我认为迟来总比没有好。问题是,您正在注册方法,这些方法可以调用如下
x$`[`(1:3)
而你却想
x[1:3]
下面将正确地分派所有[
和[<-
调用(通过S3)给所有R6对象。
`[.R6` <- function(x, ...) x$`[`(...)
`[<-.R6` <- function(x, ...) x$`[<-`(...)
请注意,您不应该对[[
方法执行类似的操作,因为这些方法已经定义并使用了,因为R6对象是环境。
理想情况下,如果(
也可以被重写,以便我们可以创建函子对象(例如调用x(2)
),那就太好了,但是我不知道如何做到这一点。
https://stackoverflow.com/questions/50842251
复制相似问题