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
  •  | 
  •  

Question

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?

Was it helpful?

Solution

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top