编写另一个类中包含的类的方法

时间:2015-06-20 21:20:25

标签: r

假设我的结构看起来像这样

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"
}

1 个答案:

答案 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