R中的抽象类型

Gum*_*meo 5 r abstract-data-type s4 julia

我想在R中创建类,假设它是一个人的S4类.例如

setClass("Person", slots = list(name = "character", mood = "myMoodType"))
Run Code Online (Sandbox Code Playgroud)

现在我想创建myMoodType一个抽象类型,它只能取三个值"Happy","Sad"和"Unknown".

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

abstract myMoodType
type Happy   <: myMoodType             end
type Sad     <: myMoodType             end
type Unknown <: myMoodType             end
Run Code Online (Sandbox Code Playgroud)

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

Bac*_*lin 4

这可能不是 R 最强、最流畅的功能之一,但您可以通过以下方式解决它。有关更多信息,请参阅有关 S4 的文档或高级 R 章节。

\n\n

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

\n\n
check_person <- function(object) {\n    if(identical(levels(object@mood), c("Happy", "Sad", "Unknown"))){\n        return(TRUE)\n    } else {\n        return("Invalid mood.")\n    }\n}\n\nsetClass("Person",\n         representation(name = "character", mood = "factor"),\n         prototype = list(name = NA_character_,\n                          mood = factor(NA, c("Happy", "Sad", "Unknown"))),\n         validity = check_person)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,创建新实例new有点混乱,因为我们每次都必须写出所有级别:

\n\n
john <- new("Person", name="John", mood=factor("Happy", levels=c("Happy", "Sad", "Unknown")))\nlucy <- new("Person", name="Lucy", mood=factor("Sad", levels=c("Happy", "Sad", "Unknown")))\n
Run Code Online (Sandbox Code Playgroud)\n\n

否则我们会得到一个错误:

\n\n
new("Person", name="Eve", mood="Unknown")\n
Run Code Online (Sandbox Code Playgroud)\n\n
Error in validObject(.Object) : \n  invalid class \xe2\x80\x9cPerson\xe2\x80\x9d object: invalid object for slot "mood" in class "Person":\n  got class "character", should be or extend class "factor"\n
Run Code Online (Sandbox Code Playgroud)\n\n

为了解决这个问题,你可以创建自己的构造函数:

\n\n
new_person <- function(name, mood){\n    new("Person", name = name, mood = factor(mood, levels = c("Happy", "Sad", "Unknown")))\n}\nnew_person("Eve", "Unknown")\n
Run Code Online (Sandbox Code Playgroud)\n\n
An object of class "Person"\nSlot "name":\n[1] "Eve"\n\nSlot "mood":\n[1] Unknown\nLevels: Happy Sad Unknown\n
Run Code Online (Sandbox Code Playgroud)\n