當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R groupGeneric S3組通用函數


R語言 groupGeneric 位於 base 包(package)。

說明

可以為以下預先指定的函數組定義組通用方法,Math,Ops,matrixOps,SummaryComplex。 (基礎中沒有這些名稱的對象R,但有在methods包,還沒有matrixOps.)

為組中的單個成員定義的方法優先於為整個組定義的方法。

用法

## S3 methods for group generics have prototypes:
Math(x, ...)
Ops(e1, e2)
Complex(z)
Summary(..., na.rm = FALSE)
matrixOps(x, y)

參數

x , y , z , e1 , e2

對象。

...

進一步的參數傳遞給方法。

na.rm

邏輯:缺失值應該被刪除嗎?

細節

有五個團體可以為其編寫 S3 方法,即"Math","Ops","Summary","matrixOps", 和"Complex"組。這些不是R基礎中的物體R,但可以為它們提供方法和基礎R包含factor,data.framedifftime前三組的方法。 (還有一個ordered方法用於Ops,POSIXtDate方法用於MathOps,package_version方法用於OpsSummary, 以及ASAts方法用於Ops包裝內stats.)

  1. "Math"

    • abs,sign,sqrt,
      floor,ceiling,trunc,
      round,signif

    • exp,log,expm1,log1p,
      cos,sin,tan,
      cospi,sinpi,tanpi,
      acos,asin,atan

      cosh,sinh,tanh,
      acosh,asinh,atanh

    • lgamma , gamma , digamma , trigamma

    • cumsum , cumprod , cummax , cummin

    該小組的成員在 x 上調度。大多數成員僅接受一個參數,但成員 logroundsignif 接受一兩個參數,而 trunc 接受一個或多個參數。

  2. "Ops"

    • "+" , "-" , "*" , "/" , "^" , "%%" , "%/%"

    • "&" , "|" , "!"

    • "==" , "!=" , "<" , "<=" , ">=" , ">"

    該組包含二元和一元運算符( +-! ):當遇到一元運算符時,將使用一個參數調用 Ops 方法,並且 e2 會丟失。

    在調度該組的任何成員時都會考慮這兩個參數的類。對於每個參數,檢查其類向量以查看是否存在匹配的特定(首選)或 Ops 方法。如果僅為一個參數找到一種方法,或者為兩個參數找到相同的方法,則使用該方法。如果發現不同的方法,則調用通用chooseOpsMethod()來選擇適當的方法。 (有關詳細信息,請參閱?chooseOpsMethod)。如果 chooseOpsMethod() 無法解析該方法,則會出現有關“不兼容方法”的警告:在這種情況下,或者如果任一參數都找不到方法,則使用內部方法。

    請注意,用於比較( "Compare" : ==< 、 ...)和邏輯( "Logic" : & |! )運算符的 data.frame 方法返回邏輯值matrix 而不是數據幀,以方便和向後兼容。

    如果該組的成員作為函數調用,則刪除任何參數名稱以確保始終使用位置匹配。

  3. "matrixOps"

    • "%*%"

    該組當前僅包含矩陣乘法 %*% 二元運算符,其中至少應遵循 crossprod()tcrossprod()。該組的成員與 Ops 組具有相同的調度語義(使用兩個參數)。

  4. "Summary"

    • all , any

    • sum , prod

    • min , max

    • range

    該組的成員根據提供的第一個參數進行調度。

    請注意,"Summary""Math" 組的 data.frame 方法需要 “numeric-alike” 列 x ,即滿足

          is.numeric(x) || is.logical(x) || is.complex(x)
  5. "Complex"

    • Arg , Conj , Im , Mod , Re

    該小組的成員在 z 上調度。

請注意,僅當方法對應於 "class" 屬性時,該方法才會用於這些組之一或其成員之一,因為內部代碼在 oldClass 上分派,而不是在 class 上分派。這是為了提高效率:必須在 Ops.integer 上進行調度會太慢。

在分派之前不會檢查為 "Math" 組泛型方法的原始成員提供的參數數量。

組通用函數的參數沒有惰性求值。

技術細節

這些函數都是原始函數和 internal generic

方法分派和變量(例如 .Generic)的詳細信息在 UseMethod 的幫助中討論。有一些小的差異:

  • 對於 Ops 組的運算符,對象 .Method 是一個 length-two 字符向量,其元素分別是為左參數和右參數選擇的方法。 (如果未選擇任何方法,則相應的元素為 "" 。)

  • 對象 .Group 記錄用於調度的組(如果使用特定方法,則為 "" )。

注意

methods 確實包含具有這些名稱的對象,它以令人困惑的類似(但不同)的方式重新使用了這些對象。請參閱該包的幫助。

例子

require(utils)

d.fr <- data.frame(x = 1:9, y = stats::rnorm(9))
class(1 + d.fr) == "data.frame" ##-- add to d.f. ...

methods("Math")
methods("Ops")
methods("Summary")
methods("Complex")  # none in base R

參考

Appendix A, Classes and Methods of
Chambers, J. M. and Hastie, T. J. eds (1992) Statistical Models in S. Wadsworth & Brooks/Cole.

也可以看看

methods 用於非內部泛型函數的方法。

S4groupGeneric 用於 S4 方法的組泛型。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 S3 Group Generic Functions。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。