假设我的结构看起来像这样
obj <- list()
obj$title <- "Hello"
obj$data <- data.frame(c(1,2,3,4,5),c(5,4,3,2,1))
class(obj) <- "myclass"
我知道我可以在课堂上编写方法:
myfunction <- function(obj,...) {
UseMethod("myfunction")
}
myfunction.myclass <- function(obj,...) {
# magic
}
但是我如何根据它们的类为对象中包含的数据编写方法。我的意思是不必在同一个函数中写出所有内容。有点像......
myfunction.myclass.data.frame <- function(obj,...) {
# do something if class(obj$data) == "data.frame"
}
myfunction.myclass.character <- function(obj,...) {
# do something if class(obj$data) == "character"
}
myfunction.myclass.numeric <- function(obj,...) {
# do something if class(obj$data) == "numeric"
}
答案 0 :(得分:3)
您可以做的是通过从中调用UseMethod()
使myfunction.myclass()
成为二级通用(其中myfunction()
将是第一级通用),而不是省略第二级参数(通常已完成,默认为封闭函数的第一个参数),您可以将obj$data
传递给它。这将根据obj$data
:
## define first-level obj generic
myfunction <- function(obj,...) UseMethod('myfunction');
## define second-level obj$data generic
myfunction.myclass <- function(obj,...) UseMethod('myfunction.myclass',obj$data);
## define obj$data specifics
myfunction.myclass.data.frame <- function(obj,...) { cat('----- class -----\ndata.frame\n----- obj -----\n'); print(obj); cat('----- args -----\n'); print(list(...)); };
myfunction.myclass.character <- function(obj,...) { cat('----- class -----\ncharacter\n----- obj -----\n'); print(obj); cat('----- args -----\n'); print(list(...)); };
myfunction.myclass.numeric <- function(obj,...) { cat('----- class -----\nnumeric\n----- obj -----\n'); print(obj); cat('----- args -----\n'); print(list(...)); };
myfunction.myclass.default <- function(obj,...) { cat('----- class -----\ndefault\n----- obj -----\n'); print(obj); cat('----- args -----\n'); print(list(...)); };
## create test obj
obj <- list();
obj$title <- 'Hello';
class(obj) <- 'myclass';
## demo 1: data.frame
obj$data <- data.frame(a=c(1,2,3,4,5),b=c(5,4,3,2,1));
myfunction(obj,1,'a',T);
## ----- class -----
## data.frame
## ----- obj -----
## $title
## [1] "Hello"
##
## $data
## a b
## 1 1 5
## 2 2 4
## 3 3 3
## 4 4 2
## 5 5 1
##
## attr(,"class")
## [1] "myclass"
## ----- args -----
## [[1]]
## [1] 1
##
## [[2]]
## [1] "a"
##
## [[3]]
## [1] TRUE
## demo 2: character
obj$data <- letters;
myfunction(obj,2,'b',F);
## ----- class -----
## character
## ----- obj -----
## $title
## [1] "Hello"
##
## $data
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
##
## attr(,"class")
## [1] "myclass"
## ----- args -----
## [[1]]
## [1] 2
##
## [[2]]
## [1] "b"
##
## [[3]]
## [1] FALSE
## demo 3: numeric
obj$data <- 1:10;
myfunction(obj,3,'c',T);
## ----- class -----
## numeric
## ----- obj -----
## $title
## [1] "Hello"
##
## $data
## [1] 1 2 3 4 5 6 7 8 9 10
##
## attr(,"class")
## [1] "myclass"
## ----- args -----
## [[1]]
## [1] 3
##
## [[2]]
## [1] "c"
##
## [[3]]
## [1] TRUE
## demo 4: default (logical)
obj$data <- T;
myfunction(obj,4,'d',F);
## ----- class -----
## default
## ----- obj -----
## $title
## [1] "Hello"
##
## $data
## [1] TRUE
##
## attr(,"class")
## [1] "myclass"
## ----- args -----
## [[1]]
## [1] 4
##
## [[2]]
## [1] "d"
##
## [[3]]
## [1] FALSE