| #### 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 |
| y < x # should be the same (warning msg not, however) |
| x == y |
| x <= y |
| |
| x > 3 ##[1] ">.foo" |
| |
| rm(list=">.foo") |
| x > 3 #-> "Ops.foo" and ">.bar" |
| |
| |
| |
| ### ------------ 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) |
| e0 <- expression((x)) |
| e1 <- expression(sin(x)) |
| abc(e0) |
| abc(e1) |
| abc(e0[[1]]) |
| abc(e1[[1]]) |