这是不起作用的:
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]
以下将全部派发[
and [<-
对所有 R6 对象正确调用(通过 S3)。
`[.R6` <- function(x, ...) x$`[`(...)
`[<-.R6` <- function(x, ...) x$`[<-`(...)
请注意,您不应该为[[
方法,因为这些方法已经被定义和使用,因为 R6 对象是环境。
理想情况下,如果(
也可以被重写,以便我们可以创建函子对象(例如调用x(2)
),但我不知道如何做到这一点..
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)