【问题标题】:Making subclass of list制作列表的子类
【发布时间】:2014-06-18 11:09:54
【问题描述】:

我有以下代码

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)

导致:

> class(obj[1])
[1] "list"
> class(obj[2])
[1] "list"
> class(obj[1:2])
[1] "list"
> class(obj)
[1] "mysubclass"

什么是不通过子集丢失类的正确解决方案?例如,class(obj[1:2]) 的结果是 mysubclass,并且仍然表现为一个列表。

【问题讨论】:

    标签: r r-s3


    【解决方案1】:

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

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

    或者

    '[.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
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2018-03-22
      • 1970-01-01
      相关资源
      最近更新 更多