Abstract types in R

I want to create a class in R, let's say this is an S4 class for humans. For example.

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

Now I want to create myMoodTypeas an abstract type, which can take only three values: "Happy", "Sad" and "Unknown".

I know that I could do this using validity for S4 classes, and set it up as a character type, and check for validity by checking that the provided character string is one of the three options that I list. But I would like to know if I can define an abstract type, for example in julia.

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

What would be the right approach to this in R?

+4
source share
1 answer

R, . . R 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
+2

Source: https://habr.com/ru/post/1613803/


All Articles