Why does the default S3 method gets called when I pass a vector to the method and the vector S3 method is implemented?

StackOverflow https://stackoverflow.com/questions/13760876

  •  05-12-2021
  •  | 
  •  

Вопрос

I have defined the following in R:

plotWaterfall         <- function(x, ...) UseMethod("plotWaterfall")
plotWaterfall.default <- function(x, ...) {print("Default method does nothing")}
plotWaterfall.vector  <- function(x, ...) {print("Vector method does something")}

Now if I test the following example:

x<-c(1,2,3)
plotWaterfall(x)

it will print "Default method does nothing" indicating that the S3 framework matches the default method instead of the vector method. Now why is that?

Это было полезно?

Решение

It's because the class of your vector is numeric. So you have to do this:

plotWaterfall.numeric  <- function(x, ...) {print("Numeric vector")}

plotWaterfall(x)
[1] "Numeric vector"

You can determine the class of an object with the class() function:

class(x)
[1] "numeric"

This behaviour is described in the help for ?UseMethod:

Method dispatch takes place based on the class(es) of the first argument to the generic function or of the object supplied as an argument to UseMethod

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top