R version 3.2.2 RC (2015-08-08 r68914) -- "Fire Safety" Copyright (C) 2015 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > #### Testing UseMethod() and even more NextMethod() > #### -------------------- > #### i.e., S3 methods *only*. For S4, see reg-S4.R > ## ~~~~~~~~ > > ###-- Group methods > > ## previous versions used print() and hit an auto-printing bug. > > ### Arithmetic "Ops" : > ">.bar" <- function(...) {cat("using >.bar\n"); FALSE} > ">.foo" <- function(...) {cat("using >.foo\n"); TRUE} > Ops.foo <- function(...) { + cat("using Ops.foo\n") + NextMethod() + } > Ops.bar <- function(...) { + cat("using Ops.bar\n") + TRUE + } > > x <- 2:4 ; class(x) <- c("foo", "bar") > y <- 4:2 ; class(y) <- c("bar", "foo") > > ## The next 4 give a warning each about incompatible methods: > x > y [1] FALSE FALSE TRUE Warning message: Incompatible methods (">.foo", ">.bar") for ">" > y < x # should be the same (warning msg not, however) [1] FALSE FALSE TRUE Warning message: Incompatible methods ("Ops.bar", "Ops.foo") for "<" > x == y [1] FALSE TRUE FALSE Warning message: Incompatible methods ("Ops.foo", "Ops.bar") for "==" > x <= y [1] TRUE TRUE FALSE Warning message: Incompatible methods ("Ops.foo", "Ops.bar") for "<=" > > x > 3 ##[1] ">.foo" using >.foo [1] TRUE > > rm(list=">.foo") > x > 3 #-> "Ops.foo" and ">.bar" using Ops.foo using >.bar [1] FALSE > > > > ### ------------ was ./mode-methods.R till R ver. 1.0.x ---------------- > > ###-- Using Method Dispatch on "mode" etc : > ## Tests S3 dispatch with the class attr forced to be data.class > ## Not very relevant when S4 methods are around, but kept for historical interest > abc <- function(x, ...) { + cat("abc: Before dispatching; x has class `", class(x), "':", sep="") + str(x) + UseMethod("abc", x) ## UseMethod("abc") (as in S) fails + } > > abc.default <- function(x, ...) sys.call() > > "abc.(" <- function(x) + cat("'(' method of abc:", deparse(sys.call(sys.parent())),"\n") > abc.expression <- function(x) + cat("'expression' method of abc:", deparse(sys.call(sys.parent())),"\n") > > abc(1) abc: Before dispatching; x has class `numeric': num 1 abc.default(1) > e0 <- expression((x)) > e1 <- expression(sin(x)) > abc(e0) abc: Before dispatching; x has class `expression': expression((x)) 'expression' method of abc: abc.expression(e0) > abc(e1) abc: Before dispatching; x has class `expression': expression(sin(x)) 'expression' method of abc: abc.expression(e1) > abc(e0[[1]]) abc: Before dispatching; x has class `(': language, mode "(": (x) '(' method of abc: `abc.(`(e0[[1]]) > abc(e1[[1]]) abc: Before dispatching; x has class `call': language sin(x) abc.default(e1[[1]]) >