определить метод S4, если уже есть функция с таким же именем - PullRequest
2 голосов
/ 27 декабря 2011

У меня есть функция myFunction , и мне нужно создать метод S4 с тем же именем (не спрашивайте меня, почему).
Я бы хотел сохранить прежнюю функциональность myFunction.

Есть ли способ сохранить мою старую функцию?

Я бы не стал устанавливать универсальный для этой старой функции, так как подпись может сильно отличаться ...

1 Ответ

6 голосов
/ 27 декабря 2011

Да, есть способ сохранить ваши старые функции. И если вы не хотите, чтобы функции S3 и S4 принимали одинаковое количество аргументов одинаковых классов, это даже сложно сделать.

# Create an S3 function named "myFun"
myFun <- function(x) cat(x, "\n")

# Create an S4 function named "myFun", dispatched when myFun() is called with 
# a single numeric argument
setMethod("myFun", signature=signature(x="numeric"), function(x) rnorm(x))

# When called with a numeric argument, the S4 function is dispatched
myFun(6)
# [1]  0.3502462 -1.3327865 -0.9338347 -0.7718385  0.7593676  0.3961752

# When called with any other class of argument, the S3 function is dispatched
myFun("hello")
# hello 

Если вы do хотите, чтобы функция S4 принимала аргумент того же типа, что и функция S3, вам нужно сделать что-то вроде следующего, установив класс аргумента так, чтобы R имел некоторые способ определения, какую из двух функций вы собираетесь использовать:

setMethod("myFun", signature=signature(x="greeting"), 
          function(x) cat(x, x, x, "\n"))

# Create an object of class "greeting" that will dispatch the just-created 
# S4 function
XX <- "hello"
class(XX) <- "greeting"
myFun(XX)
# hello hello hello 

# A supplied argument of class "character" still dispatches the S3 function
myFun("hello")
# hello
...