2015-05-02 74 views
1

是否可以在R中爲S4對象定義動態構造函數?通過動態我指的是以下幾點:如何在R中爲s4對象定義動態構造函數

firstClass <- setClass(Class = "firstClass",slots = c(Name = "character", ID = "numeric")) 

現在我想定義一個構造函數,是聰明的,也就是說,它會檢查什麼樣的參數,其中由函數調用提供,並通過設置插槽創建CALSS「的Firstclass」的對象做默認或提供的參數。例如

firstClass <- function(Name, ID){ 
    if(missing(Name) & missing(ID)){ 
    return(new(Class = firstClass)) 
    } 
    if(missing(Name) & !missing(ID)){ 
    return(new(Class = firstClass,ID = ID)) 
    } 
    if(!missing(Name) & missing(ID)){ 
    return(new(Class,Name = Name)) 
    } 
    if(!missing(Name) & !missing(ID)){ 
    return(new(Class, Name = Name, ID = ID)) 
    } 
} 

很明顯,一些理智檢查也應該做。這個構造函數正是我想要的,取決於它構造一個對象的調用。然而,對於一個簡單的課程(少數時間段)來說,這沒問題,但隨着更多時間段的複雜性增長。所以我想知道是否有一個優雅的方式來做到這一點。

+0

您是否嘗試了運行缺省'firstClass()'以更改編號。的論點?它已經做到了你想要的。 –

回答

1

使用原型如果必要

firstClass <- function(Name=character(), ID=0L) 
    .firstClass(Name=Name, ID=as.integer(ID)) 

提供健全的默認值

.firstClass <- 
    setClass(Class = "firstClass", 
      representation = representation(
       Name = "character", 
       ID = "integer"), 
      prototype=c(ID=0L)) 

使用默認值作爲在構造參數,以及脅迫適當類型(.firstClass是輕包裝大約在new("firstClass", ...),對我來說,它提供了實現細節(調用new()來構造一個類)和類構造的接口之間的一點點分離。firstClass()是第二個也是更有用的層,以不需要底層類的知識的方式將對象構造的必要參數爆炸到用戶)。在有效性方法中執行「合理性檢查」

setValidity("firstClass", function(object) { 
    msg <- NULL 
    if (length([email protected]) != 1) 
     msg <- c(msg, "ID must be length 1") 
    else if ([email protected] < 0) 
     msg <- c(msg, "ID must be >= 0") 
    if (is.null(msg)) TRUE else msg 
}) 
+0

感謝您的回答。我是R的新手,所以有兩個不同的函數有什麼好處:.firstClass和firstClass? – math

+0

@ user8將一些註釋添加到文本 –

+0

感謝您的補充評論。爲什麼然後不只是寫:'firstClass < - function(Name = character(),ID = 0L){return(new(「firstClass」,Name = Name,ID = ID))}'。 – math

相關問題