带有Date属性的R S4类:错误实例化

时间:2015-08-21 12:03:19

标签: r date initialization instantiation s4

我在R中构造一个具有“Date”类型属性的S4类。 这导致在我实例化Object时触发的validObject方法中出现问题。

setClass ("oblig", slots = c(name="character",issue_date="Date"))

myoblig<-new("oblig", name="TestOblig")

这会返回以下错误:

  

validObject(.Object)中的错误:     无效的类“必须”对象:类“义务”中的插槽“issue_date”的无效对象:得到类“S4”,应该是或扩展类“日期”

我做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为这个问题与没有&#34;默认&#34;的事实有关。 Date类对象的表示。考虑一下:

R> as.integer()
#integer(0)
R> as.character()
#character(0)
R> as.numeric()
#numeric(0)
R> as.Date()
#Error in as.Date.default() : argument "x" is missing, with no default

&#34;基本&#34;类型(缺少更好的单词)可以无中心地构建,但Date对象不是这种情况。相反,如果我们有以下类foo,其插槽只包含&#34; basic&#34;数据类型,部分初始化不是问题:

foo <- setClass("foo", slots = c(s1 = "character", s2 = "numeric"))
bar <- new("foo", s1 = "abz")
##
R> bar
#An object of class "foo"
#Slot "s1":
#  [1] "abz"

#Slot "s2":
#  numeric(0)

话虽如此,我可以考虑使用oblig类的三个选项:

oblig <- setClass(
  "oblig", 
  slots = c(name="character",issue_date="Date"))

首先,您可以实例化 oblig,即不要初始化其任何广告位。我完全确定具体细节,但或多或​​少我认为问题是当您将任何其他值传递给new时,它会导致通用{{1}要调用的函数,它将尝试初始化对象的所有插槽。

例如,

initialize

然后,您可以在之后提供插槽值:

no_init <- new("oblig")
##
R> no_init
#An object of class "oblig"
#Slot "name":
#  character(0)

#Slot "issue_date":
#  <S4 Type Object>
#  attr(,".S3Class")
#[1] "Date"

其次,您可以提供完整初始化而不是部分初始化:

no_init@issue_date <- Sys.Date()
##
R> no_init
#An object of class "oblig"
#Slot "name":
#  character(0)

#Slot "issue_date":
#  [1] "2015-08-21"

那里没有问题。

最后,您可以通过将列表传递给full_init <- new("oblig", name = "TestOblig", issue_date = Sys.Date()) ## R> full_init #An object of class "oblig" #Slot "name": # [1] "TestOblig" #Slot "issue_date": # [1] "2015-08-21" 的{​​{1}}参数来指定默认初始化值:

prototype

就个人而言,我会选择这条路线。