制作列表的子类

Pet*_*usu 3 r r-s3

我有以下代码

obj <- list(list(a=4,f=5,g=5),list(a=44,f=54,g=54))
class(obj) <- "mysubclass"

class(obj[1])
class(obj[2])
class(obj[1:2])
class(obj)
Run Code Online (Sandbox Code Playgroud)

导致:

> class(obj[1])
[1] "list"
> class(obj[2])
[1] "list"
> class(obj[1:2])
[1] "list"
> class(obj)
[1] "mysubclass"
Run Code Online (Sandbox Code Playgroud)

通过子集化不会失去课程的适当解决方案是什么?例如,class(obj[1:2])结果mysubclass仍然表现为列表.

csg*_*pie 5

问题是泛型[方法剥离了class属性.为避免这种情况,您可以定义自己的通用mysubclass,即

## Answer suggested by Petr Matousu
## Based on simple.list method
'[.mysubclass' = function(x, i, ...) {
    structure(NextMethod("["), class = class(x))
 }
Run Code Online (Sandbox Code Playgroud)

要么

'[.mysubclass' = function(x, i, j, ..., drop=TRUE) {
    ## Store the class attribute
    cl = class(x)
    ## Pass your object to the next method
    y = NextMethod('[')
    ## Update the class and return
    class(y) = cl
    y
}
Run Code Online (Sandbox Code Playgroud)

您的示例现在按预期工作.您还应该看看:

  • help('[')
  • methods('[')