R中的抽象类型

时间:2015-10-30 09:40:57

标签: r julia s4 abstract-data-type

我想在R中创建类,假设它是一个人的S4类。 E.g。

setClass("Person", slots = list(name = "character", mood = "myMoodType"))

现在我想创建myMoodType为抽象类型,只能取三个值“Happy”,“Sad”和“Unknown”。

我知道我可以使用S4类的有效性进行此操作,并将心情作为字符类型,并通过验证提供的字符串是我列出的三个选项之一来检查有效性。但我想知道我是否可以定义一个抽象类型,例如julia,例如

abstract myMoodType
type Happy   <: myMoodType             end
type Sad     <: myMoodType             end
type Unknown <: myMoodType             end

在R中解决这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

这可能不是R最强大和最流畅的功能之一,但您可以通过以下方式解决它。有关详细信息,请参阅the documentationAdvanced R chapter on S4

首先设置具有表示为因子的情绪的Person类,并将其链接到检查其级别的验证函数。

check_person <- function(object) {
    if(identical(levels(object@mood), c("Happy", "Sad", "Unknown"))){
        return(TRUE)
    } else {
        return("Invalid mood.")
    }
}

setClass("Person",
         representation(name = "character", mood = "factor"),
         prototype = list(name = NA_character_,
                          mood = factor(NA, c("Happy", "Sad", "Unknown"))),
         validity = check_person)

使用new创建新实例有点麻烦,因为我们每次都必须写出所有级别:

john <- new("Person", name="John", mood=factor("Happy", levels=c("Happy", "Sad", "Unknown")))
lucy <- new("Person", name="Lucy", mood=factor("Sad", levels=c("Happy", "Sad", "Unknown")))

否则我们会收到错误:

new("Person", name="Eve", mood="Unknown")
Error in validObject(.Object) : 
  invalid class “Person” object: invalid object for slot "mood" in class "Person":
  got class "character", should be or extend class "factor"

要解决这个问题,你可以制作自己的构造函数:

new_person <- function(name, mood){
    new("Person", name = name, mood = factor(mood, levels = c("Happy", "Sad", "Unknown")))
}
new_person("Eve", "Unknown")
An object of class "Person"
Slot "name":
[1] "Eve"

Slot "mood":
[1] Unknown
Levels: Happy Sad Unknown