Я пишу пакет R. В этом пакете я хочу иметь специальный тип фрейма данных, который могут распознавать некоторые функции, например, с некоторыми дополнительными атрибутами, но в остальном действующий точно так же, как фрейм данных. Один из способов добиться того, чего я хочу, - просто установить некоторые атрибуты в обычном фрейме данных:
makedf <- function() {
df <- data.frame(ID=1:3)
attr(df, "myDF") <- TRUE
attr(df, "source") <- "my nose"
return(df)
}
dosmth <- function(df) {
if(!is.null(attr(df, "myDF"))) message(sprintf("Oh my! My DF! From %s!", attr(df, "source")))
message(sprintf("num of rows: %d", nrow(df)))
}
Когда dosmth()
получает "myDF", у него есть дополнительная информация об источнике фрейма данных:
dosmth(data.frame(1:5))
#> num of rows: 5
dosmth(makedf())
#> Oh my! My DF! From my nose!
#> num of rows: 3
Точно так же с S3 это было бы довольно просто, и мы могли бы даже написать разные варианты dosmth, используя преимущества диспетчеризации методов. Как мне это сделать с S4?