# Define the parent function that calls the dispatcher
abs.max <- function(...) UseFunction('abs.max', ...)
# By convention the guard is defined before the concrete function variant
guard(abs.max.recursive1, is.numeric(a) && length(a) > 1)
abs.max.recursive1 <- function(a) abs.max(a[1], abs.max(a[2:length(a)]))
guard(abs.max.recursive2, is.numeric(a) && length(a) == 1)
abs.max.recursive2 <- function(a) a
guard(abs.max.csv, is.character(a) && grep(',',a,fixed=TRUE) == 1)
abs.max.csv <- function(a)
abs.max(as.numeric(strsplit(a, ',', fixed=TRUE)[[1]]))
guard(abs.max.psv, is.character(a) && grep('|',a,fixed=TRUE) == 1)
abs.max.psv <- function(a)
abs.max(as.numeric(strsplit(a, '|', fixed=TRUE)[[1]]))
# The explicit form allows multiple guard functions
guard(abs.max.twoArg, c( function(a,b) is.numeric(a), function(a,b) is.numeric(b)) )
abs.max.twoArg <- function(a, b) max(abs(a), abs(b))
# Using a guard of TRUE acts as a default condition
guard(abs.max.twoArgDefault, TRUE)
abs.max.twoArgDefault <- function(a,b) abs.max(as.numeric(a), as.numeric(b))
# Test some output
abs.max(2,-3) # Calls abs.max.twoArg
abs.max("3","-4") # Calls abs.max.twoArgDefault
abs.max(3,"-4") # Calls abs.max.twoArgDefault
a <- rnorm(10)
abs.max(a) # Calls abs.max.recursive1
abs.max(c('12,-3,-5,8,-13,3,1,3')) # Calls abs.max.csvRun the code above in your browser using DataLab