R 中的抽象类型
Abstract types in R
我想在 R 中创建 class,假设它是一个人的 S4 class。例如
setClass("Person", slots = list(name = "character", mood = "myMoodType"))
现在我想将myMoodType
创建为一个抽象类型,它只能取三个值"Happy"、"Sad"和"Unknown"。
我知道我可以使用 S4 classes 的有效性来做到这一点,并将心情作为字符类型,并通过验证提供的字符串是我列出的三个选项之一来检查有效性.但是我想知道我是否可以定义一个抽象类型,比如在 julia 中,例如
abstract myMoodType
type Happy <: myMoodType end
type Sad <: myMoodType end
type Unknown <: myMoodType end
在 R 中处理此问题的正确方法是什么?
这可能不是 R 中最强大和最流畅的功能之一,但您可以通过以下方式解决它。有关详细信息,请参阅 the documentation or the Advanced R chapter on S4。
首先设置 Person class 将情绪表示为一个因素,然后 link 将其设置为检查其水平的验证函数。
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
我想在 R 中创建 class,假设它是一个人的 S4 class。例如
setClass("Person", slots = list(name = "character", mood = "myMoodType"))
现在我想将myMoodType
创建为一个抽象类型,它只能取三个值"Happy"、"Sad"和"Unknown"。
我知道我可以使用 S4 classes 的有效性来做到这一点,并将心情作为字符类型,并通过验证提供的字符串是我列出的三个选项之一来检查有效性.但是我想知道我是否可以定义一个抽象类型,比如在 julia 中,例如
abstract myMoodType
type Happy <: myMoodType end
type Sad <: myMoodType end
type Unknown <: myMoodType end
在 R 中处理此问题的正确方法是什么?
这可能不是 R 中最强大和最流畅的功能之一,但您可以通过以下方式解决它。有关详细信息,请参阅 the documentation or the Advanced R chapter on S4。
首先设置 Person class 将情绪表示为一个因素,然后 link 将其设置为检查其水平的验证函数。
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