R S4 class with Date 属性:错误实例化
R S4 class with Date attribute: error instantiating
我正在 R 中构建一个 S4 class,它具有一些 "Date" 类型的属性。
这会在我实例化对象时触发的 validObject 方法中引起问题。
setClass ("oblig", slots = c(name="character",issue_date="Date"))
myoblig<-new("oblig", name="TestOblig")
此returns以下错误:
Error in validObject(.Object) :
invalid class “oblig” object: invalid object for slot "issue_date" in class "oblig": got class "S4", should be or extend class "Date"
我做错了什么?
我认为这个问题与没有 "default" 表示 Date
class 对象这一事实有关。考虑一下:
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
"basic" 类型(缺少更好的词)可以无中生有,但 Date
对象并非如此。相反,如果我们有以下 class、foo
,其槽仅由 "basic" 数据类型组成,部分初始化不是问题:
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
class:
想到三个选项
oblig <- setClass(
"oblig",
slots = c(name="character",issue_date="Date"))
首先,您可以 实例化 一个 oblig
,即不初始化它的任何插槽。我完全确定具体细节,但或多或少我认为问题在于,当您将 any 附加值传递给 new
时,它会导致通用 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"
没有问题。
最后,您可以通过将列表传递给 setClass
的 prototype
参数来指定默认初始化值:
oblig <- setClass(
"oblig",
slots = c(name="character",issue_date="Date"),
prototype = list(
name = character(0),
issue_date = Sys.Date()))
##
partial_init <- new("oblig", name = "TestOblig")
##
R> partial_init
#An object of class "oblig"
#Slot "name":
# [1] "TestOblig"
#Slot "issue_date":
# [1] "2015-08-21"
就我个人而言,我会选择这条路线。
我正在 R 中构建一个 S4 class,它具有一些 "Date" 类型的属性。 这会在我实例化对象时触发的 validObject 方法中引起问题。
setClass ("oblig", slots = c(name="character",issue_date="Date"))
myoblig<-new("oblig", name="TestOblig")
此returns以下错误:
Error in validObject(.Object) : invalid class “oblig” object: invalid object for slot "issue_date" in class "oblig": got class "S4", should be or extend class "Date"
我做错了什么?
我认为这个问题与没有 "default" 表示 Date
class 对象这一事实有关。考虑一下:
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
"basic" 类型(缺少更好的词)可以无中生有,但 Date
对象并非如此。相反,如果我们有以下 class、foo
,其槽仅由 "basic" 数据类型组成,部分初始化不是问题:
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
class:
oblig <- setClass(
"oblig",
slots = c(name="character",issue_date="Date"))
首先,您可以 实例化 一个 oblig
,即不初始化它的任何插槽。我完全确定具体细节,但或多或少我认为问题在于,当您将 any 附加值传递给 new
时,它会导致通用 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"
没有问题。
最后,您可以通过将列表传递给 setClass
的 prototype
参数来指定默认初始化值:
oblig <- setClass(
"oblig",
slots = c(name="character",issue_date="Date"),
prototype = list(
name = character(0),
issue_date = Sys.Date()))
##
partial_init <- new("oblig", name = "TestOblig")
##
R> partial_init
#An object of class "oblig"
#Slot "name":
# [1] "TestOblig"
#Slot "issue_date":
# [1] "2015-08-21"
就我个人而言,我会选择这条路线。