是否可以为R中的多个类使用“嵌套”方法?

时间:2016-11-14 16:58:47

标签: r class

说一个有两个对象:

a = 1:3
class(a) = append("myclass", class(a))
class(a)
[1] "myclass" "integer"

b = c("a", "b", "c")
class(b) = append("myclass", class(b))
class(b)
[1] "myclass"   "character"

那么可以定义嵌套方法,这些方法将依赖于“myclass”和基本/其他自定义类的两者吗? E.g。

print.myclass.integer = function(x) { some code }
print.myclass.character = function(x) { different code }

如果是,那么正确的程序是什么?

2 个答案:

答案 0 :(得分:1)

您可以通过在print.myclass内查看对象的其他类来解决此问题。例如:

print.myclass<-function(x,...) {
     if ("integer" %in% class(x)) print("some code") else 
        if ("character" %in% class(x)) print("some other code")
}
a
#[1] "some code"
b
#[1] "some other code"

答案 1 :(得分:0)

要为多个类设置嵌套方法,您只需嵌套UseMethod()

print.myclass <- function(x) {
  UseMethod("print.myclass", x)
}

print.myclass.integer <- function(x) {
  print(paste("This method only prints the higher 'x': ", max(x)))
}

print.myclass.character <- function(x) {
  cat("This method scrambles the 'x' values:\n")
  print(sample(x, length(x)))
}

print(a) # [1] "This method only prints the hihger 'x':  3"
print(b) #This method scrambles the 'x' values:
         # [1] "a" "c" "b"

当您使用print()时,它会调用UseMethod(),这将检查myclass方法。然后,它将再次调用UseMethod(),现在将检查integer函数的第二个类(characterprint.myclass)的方法。

查看?UseMethodmethods(print)The R Language Definition,第28-31页;它帮助了我。