2012-08-06 63 views
2

由Venables和Ripley編寫的「統計與計算」一書有一個例子,用於定義泛型函數Math的類「多項式」對象的方法函數。數學是一組函數,其中包括一些組件函數,包括abs,acos,acosh,...瞭解R中的函數switch()?

下面是本書中提到的用於定義組函數Math函數的代碼(請注意,代碼是用於S4類

setMethod("Math", "polynomial", 
      function(x) { 
      switch(.Generic, ceiling = , floor = , 
      trunc = polynomial(callGeneric([email protected]), rat = [email protected]), 
      stop(paste(.Generic, "not allowed on polynomials")) 
      )} 
     ) 

據我所知,與使用setMethod(),我們定義爲泛型函數的數學方法函數時,它被稱爲類「多項式」的對象:(新風格的R/S級))。你能解釋一下這裏有什麼開關嗎?我讀了開關將R幫助,但還是很難理解下面的部分:

switch(.Generic, ceiling = , floor = , 
      trunc = polynomial(callGeneric([email protected]), rat = [email protected]), 
      stop(paste(.Generic, "not allowed on polynomials")) 
      )} 

注意,上面的多項式函數是一個構造函數來創建類「多項式」的對象。

回答

1

.Generic標識用於調用當前函數的名稱。你可以這樣想:如果函數被調用爲ceilingfloortrunc,那麼調用給定的實現polynomial(callGeneric([email protected]), rat = [email protected]),否則會打印一個錯誤。 =之後的空參數,如ceilingfloor所示,意味着下降:實際上包含任何代碼的下一個參數將是執行的參數。

+0

我很感激@MvG。你的回答非常有幫助。 – Sam 2012-08-07 01:29:09

+0

有人低估了這個答案,是否有特殊原因這樣做?我犯的任何錯誤?我很感激評論。 – MvG 2012-08-07 06:30:39

+0

我實際上給出了兩個答案+1,既然你的答案指向了我的兩個主要問題(.Generic&=),我給了你「接受的答案」。 – Sam 2012-08-07 13:47:05

3

我認爲這是信息的代碼玩(這個理解我對傳播純粹是從我剛剛看到,我甚至不知道你能以這種方式使用開關):

您的代碼調整以功能外運行:

test <- "ceiling" 
test <- "floor" 
test <- "trunc" 

switch(test, 
    ceiling = , 
    floor = , 
    trunc = mean(1:10), 
    stop(paste(test, "not allowed on polynomials")) 
) 

嘗試每個條件測試,你會看到,如果天花板,地板或TRUNC返回什麼TRUNC =。如果你把東西在地板:

test <- "floor" 

switch(test, 
    ceiling = , 
    floor = 5, 
    trunc = mean(1:10), 
    stop(paste(test, "not allowed on polynomials")) 
) 

你得到了不同的反應。

我可能是錯的,但我認爲這也可以寫成:

if (.Generic %in% c(ceiling, "floor", "trunc"){ 
    polynomial(callGeneric([email protected]), rat = [email protected]) 
} else { 
    stop(paste(.Generic, "not allowed on polynomials")) 
} 

如果有興趣的這種解釋是正確的,但我不熟悉這個特殊的背景。

+0

謝謝@Tyler Rinker。我100%同意,我應該多玩點代碼。我的問題主要是找出爲什麼我們將trunc定義爲與構造函數相同,以及.Generic所反駁的。我很感謝你的回答。 – Sam 2012-08-07 01:31:49