Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有日期属性的R S4类:实例化时出错_R_Date_Initialization_Instantiation_S4 - Fatal编程技术网

具有日期属性的R S4类:实例化时出错

具有日期属性的R S4类:实例化时出错,r,date,initialization,instantiation,s4,R,Date,Initialization,Instantiation,S4,我正在R中构造一个S4类,它有一些类型为“Date”的属性。 这导致validObject方法出现问题,在实例化对象时会触发该方法 setClass ("oblig", slots = c(name="character",issue_date="Date")) myoblig<-new("oblig", name="TestOblig") setClass(“oblig”,slots=c(name=“character”,issue\u date=“date”)) myoblig我认

我正在R中构造一个S4类,它有一些类型为“Date”的属性。 这导致validObject方法出现问题,在实例化对象时会触发该方法

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

myoblig<-new("oblig", name="TestOblig")
setClass(“oblig”,slots=c(name=“character”,issue\u date=“date”))

myoblig我认为这个问题与
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
“基本”类型(因为没有更好的词)可以从无到有地构造,但
Date
对象的情况并非如此。相反,如果我们有以下类,
foo
,其插槽仅包含“基本”数据类型,则部分初始化不是问题:

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
,即不初始化它的任何插槽。我完全确定具体细节,但或多或少我认为问题在于,当您将任何附加值传递给
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 <- 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"
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"