2017-10-16 74 views
0

我有一個類「DESeqResults」的S4對象。從本質上講,我希望能夠將新信息添加到這個對象,理想情況下,我只是想幾個插槽添加到它,所以我可以存儲的東西,如:如何擴展R S4對象以擁有新插槽並使原始對象以相同方式工作?

[email protected]_slot = 5 

我開始想我必須創建一個繼承「DESeqResults」的子類,雖然我還不確定如何在R中執行該操作,但我更關心如何保持原始對象的數據不變。

本質上,一個庫正在製作和使用這個「DESeqResults」類對象,並且在它創建並擁有一些數據之後,它將用於很多功能。在創建其中一個之後,我只是想爲對象添加一些新的信息。如果我創建一個擴展此類並具有額外插槽的類,那麼如何將所有現有數據從類的原始實例轉換爲子類的新實例?

什麼是最好的方式去實現我想在這裏做什麼?是否有可能在實例化任何對象之前修改原始類,以便在創建它們時具有我需要的額外插槽?還是有其他方法可以實現這一目標?

非常感謝!

回答

0

通常的方式做到這一點是確定的父類的新

setClass(
    "myDESRclass", 
    contains="DESeqResults", 
    slots=c(new_slot="numeric") 
) -> myDESRclass 

然後你可以使用as將對象轉換到類:

## x is some DESeqResults object 
x <- as(x,"myDESRclass") 
[email protected]_slot <- 5 

在大多數情況下,您必須致電setAs或類似的服務,但由於DESeqResults是超類,所以as方法由R預定義,並按預期工作。

如果你不希望採取這種方法,有兩種選擇,但他們不太安全:

1)使用S3代替S4。這聽起來像你沒有「擁有」DESeqResults類,所以可能很難,但myDESet$new_slot <- 5不會是一個錯誤。

2)槽被實現爲屬性,所以你可以用attr(myDESet,"new_slot") <- 5來設置槽。這個修改後的對象仍然會失敗,所以這可能會非常不穩定。