2010-11-22 68 views
6

我在R中編寫了一個S3類,它只是一個附加了一些屬性的整數。如果x1和x2是這個類的對象(稱之爲「myclass」),那麼我希望c(x1,x2)返回myclass對象的向量,其原始類定義和屬性保持不變。但是,記錄的c()行爲是去除屬性,所以看起來我需要編寫自己的c.myclass()方法。我的問題是,我該怎麼做?如何在R中編寫自定義S3類的c()函數

問題的一個例子:

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」。在實踐中,我還需要升級此方法以保留其他屬性(如我的類中的屬性「n」)。

回答

4

這並不工作,但我相信你的結論是每個向量元素是class的數字,因爲你正在做這樣的事情:

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

如果是這樣的話,你想提取的元素保留myclass屬性,您需要編寫子集方法"[.myclass"以保留屬性。

+0

謝謝約書亞,你的建議奏效。 – Abiel 2010-11-22 04:37:26

7

這裏是做一個例子(我認爲)你通過特定的方法想什麼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的屬性的數字向量。

使用所有向量的泛型,列表可能更自然。比較有意思的一點,也許以上就足夠了嗎?

相關問題