我正在写中的R的S3类,这只是与连接到它的一些属性的整数。如果x1和x2是这个类的对象(称之为“MyClass的”),那么我想C(X1,X2)返回MyClass的物体的向量与原类的定义和属性不变。然而,C的记录的行为()是删除属性,所以它似乎我需要写我自己c.myclass()方法。我的问题是,我该怎么办呢?

的问题的一个例子:

myclass <- function(x, n) structure(x, class="myclass", n=n)
x1 <- myclass(1, 5)
x2 <- myclass(2, 6)
c(x1, x2)
[1] 1 2

下面的结果就是一个类数字的项目的矢量,和原来的n属性不见了。

综观各种封装的代码,我有时会看到类似于下面的代码,在此我们需要保持class属性,但没有别的:

c.myclass <- function(..., recursive = F) {
    structure(c(unlist(lapply(list(...), unclass))), class="myclass")
}

不幸的是我还不能得到这个工作。调用c.myclass(X1,X2)的结果是,其中的载体本身具有类“MyClass的”,而是一个向量,其中向量中的每个项目具有类数字;我真的想在矢量每个项目有类“MyClass的”。在实践中我也将需要升级此方法保留其他属性,以及(如在MyClass的属性的“n”)。

有帮助吗?

解决方案

这工作,但我相信你的结论是每个向量元素是class的数字,因为你正在做的事情是这样的:

foo <- c(x1, x2)
class(foo[1])
class(foo[2])

如果是这样的话,你想提取的元素保留myclass属性,需要编写一个子集方法"[.myclass"保留属性。

其他提示

下面是做一个例子(我认为)你通过了c[具体方法想要什么:

c.myclass <- function(..., recursive = FALSE) {
    dots <- list(...)
    ns <- sapply(dots, attr, which = "n")
    classes <- rep("myclass", length(dots))
    res <- structure(unlist(dots, recursive = FALSE), class = classes)
    attr(res, "n") <- ns
    res
}

`[.myclass` <- function (x, i) {
    y <- unclass(x)[i]
    ns <- attr(x, "n")[i]
    class(y) <- "myclass"
    attr(y, "n") <- ns
    y
}


myclass <- function(x, n) structure(x, class = "myclass", n = n)
x1 <- myclass(1, 5)
x2 <- myclass(2, 6)
c(x1, x2)
c(x1, x2)[2]

但是,这是我们必须处理管理设置和附加属性的子集或保持n一个忽悠。这实际上只是用于记录n属性的数值向量。

这可能是更自然地与通用所有矢量,列表的工作。即更多地参与和也许上述比特是足够的你的情况?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top