R 的 S3
R 語言中使用 OO 有三種方式: S3、S4、與 R5。
S3 是最早的作法,也就是在 S 語言時就有了,R 內部 base 大部份都用此方式實作。
雖然在有物件導向訓練的資訊科學人眼中可能有點不倫不類之感,但也許在統計人可不管這一套,在當時堪用就好了,管你怎麼想。
S3 類別定義的方式很直接,將一個物件定義一個 "class" 屬性就得了。例如:
m <- c(1,3,3,4,5,6,6,8,9,4)
attr(m, 'class') <- 'sumax'
則 m 就是一個 'sumax' 類別。 那這要幹嘛 ? 重點來了。定義一個類別是為了在眾多亂七八糟的物件中 '辨別' 它,一個特別的它,要做一個針對它的動作。例如: 我們看到一個數列,我們可能想預測著數列下一個數字是什麼。 假設我們有 100 種預測方法,但我們想當我們呼叫
forecast(m)
R 自動會呼叫 "sumax" 這種預測方法。我們知道有其它 99 種物件會呼叫其它對應的預測方法。所以,在 R 中,forecast 這個函式就是個泛函。R 定義泛函利用 UseMethod,例如:
forecast <- function(m,...) UseMethod("forecast")
R 就會知道 forecast 是個泛函,是個 hub,它真正會去呼叫那些叫 forecast.XXXX(x,...) 的函式去執行動作。例如 forecast(m),forecast.sumax(m)。
這裡,你可能就知道類別的主要用處了 - 用來讓 R 正確對待[執行]物件 !
當然,S3 也有繼承。但它也具有相同的精神 - 使用 NextMethod() 去導引到執行下一個正確對待[執行]動作。
S3 既簡單又有它獨特的意義。
S3 是最早的作法,也就是在 S 語言時就有了,R 內部 base 大部份都用此方式實作。
雖然在有物件導向訓練的資訊科學人眼中可能有點不倫不類之感,但也許在統計人可不管這一套,在當時堪用就好了,管你怎麼想。
S3 類別定義的方式很直接,將一個物件定義一個 "class" 屬性就得了。例如:
m <- c(1,3,3,4,5,6,6,8,9,4)
attr(m, 'class') <- 'sumax'
則 m 就是一個 'sumax' 類別。 那這要幹嘛 ? 重點來了。定義一個類別是為了在眾多亂七八糟的物件中 '辨別' 它,一個特別的它,要做一個針對它的動作。例如: 我們看到一個數列,我們可能想預測著數列下一個數字是什麼。 假設我們有 100 種預測方法,但我們想當我們呼叫
forecast(m)
R 自動會呼叫 "sumax" 這種預測方法。我們知道有其它 99 種物件會呼叫其它對應的預測方法。所以,在 R 中,forecast 這個函式就是個泛函。R 定義泛函利用 UseMethod,例如:
forecast <- function(m,...) UseMethod("forecast")
R 就會知道 forecast 是個泛函,是個 hub,它真正會去呼叫那些叫 forecast.XXXX(x,...) 的函式去執行動作。例如 forecast(m),forecast.sumax(m)。
這裡,你可能就知道類別的主要用處了 - 用來讓 R 正確對待[執行]物件 !
當然,S3 也有繼承。但它也具有相同的精神 - 使用 NextMethod() 去導引到執行下一個正確對待[執行]動作。
S3 既簡單又有它獨特的意義。
留言
張貼留言