Перезапись универсального метода S3 с сохранением предыдущих методов R

#r

#r

Вопрос:

Я мог бы поклясться, что я искал эту тему еще когда-то и что-то нашел, но я не могу найти это решение — так что извиняюсь, если это повторение.

Когда вы добавляете свой собственный универсальный метод к существующему методу S3, встроенному в R (например, print, summary и т. Д.), Но вам нужно что-то добавить в отправку метода, как это работает? Так, например, если print бы не было многоточия (и, возможно, некоторых других параметров), могу ли я просто сделать что-то подобное (и поддерживать все другие общие методы, которые были у print .)

 print <- function(x, new_param_one, new_param_two, ...) { 
    UseMethod("print")
} 

print.crazy_obj <- function(x, ect, ...) { 
#STUFF
} 
  

А затем print.data.frame и все другие общие методы все равно будут существовать? Или каков наилучший способ сделать это? Спасибо!

Ответ №1:

Непонятно, почему вы хотели бы перезаписать универсальный. В вашем вопросе вы говорите

Так, например, если в print не было многоточия

Но все универсальные методы S3 имеют многоточие (по крайней мере, я не могу придумать или найти какие-либо, которые этого не делают). Именно многоточие обеспечивает функциональность, которую вы ищете.

Предположим, у вас есть функция, которая создает новый класс:

 crazy_obj <- function(x) structure(x, class = "crazy_obj")

y <- crazy_obj("biscuit")
  

Вы можете присвоить print.crazy_obj методу любые параметры, которые вам нравятся; они будут переданы из универсального через многоточие:

 print.crazy_obj <- function(x, n = 1, ...) print(paste(rep("crazy", n), x))
  

Итак, теперь мы можем сделать:

 print(y)
#> [1] "crazy biscuit"

print(y, 4)
#> [1] "crazy biscuit" "crazy biscuit" "crazy biscuit" "crazy biscuit"