| |
| R Under development (unstable) (2022-03-19 r81942) -- "Unsuffered Consequences" |
| Copyright (C) 2022 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]]) |
| > |