Определите метод показа для класса S3 - PullRequest
5 голосов
/ 07 декабря 2011

Я очень ошеломлен, узнав, что шоу является родовым S4, и что я не могу найти способ использовать диспетчеризацию S3, чтобы заставить работать функцию шоу.Простая демонстрация:

> x <- 1:5
> xx <- structure(x,class="aClass")

> show.aClass <- function(object){
+     cat("S3 dispatching.\n")
+     print(object)
+ }

> xx
[1] 1 2 3 4 5

Нет отправки S3 здесь ...

> setMethod("show","aClass",function(object){
+     cat("S4 dispatching.\n")
+     print(object)
+ })
in method for ‘show’ with signature ‘"aClass"’: no definition for class “aClass”
[1] "show"

> xx
[1] 1 2 3 4 5

Что вы думаете?

> print.aClass <- function(object){
+     cat("the print way...\n")
+     print(as.vector(object)) #drop class to avoid infinite loop!
+ }

> xx
the print way...
[1] 1 2 3 4 5

И для печати это работает.

У меня есть довольно веские причины остаться с S3 (большая часть которого сводится к минимуму накладных расходов, поскольку объекты будут широко использоваться при начальной загрузке).Как я должен определить другой метод показа и печати здесь?

1 Ответ

4 голосов
/ 07 декабря 2011

Может

setOldClass("aClass")
setMethod(show, "aClass", function(object) cat("S4\n"))
print.aClass <- function(object) { cat("S3... "); show(object) }

, а затем

> structure(1:5, class="aClass")
S3... S4

Но я не совсем понимаю, что ты хочешь делать.

...