首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在R6类上定义一个括号(`[`)运算符

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

Stack Overflow用户
提问于 2018-06-13 16:37:54
回答 1查看 318关注 0票数 5

以下是不起作用的地方:

代码语言:javascript
运行
复制
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)
        }
    )
)

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

代码语言:javascript
运行
复制
> 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更小。是否有一种直接实现此操作的方法可以直接向用户公开[操作符?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-28 21:15:31

我认为迟来总比没有好。问题是,您正在注册方法,这些方法可以调用如下

代码语言:javascript
运行
复制
x$`[`(1:3)

而你却想

代码语言:javascript
运行
复制
x[1:3]

下面将正确地分派所有[[<-调用(通过S3)给所有R6对象。

代码语言:javascript
运行
复制
`[.R6` <- function(x, ...) x$`[`(...) 
`[<-.R6` <- function(x, ...) x$`[<-`(...) 

请注意,您不应该对[[方法执行类似的操作,因为这些方法已经定义并使用了,因为R6对象是环境。

理想情况下,如果(也可以被重写,以便我们可以创建函子对象(例如调用x(2)),那就太好了,但是我不知道如何做到这一点。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50842251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档