gpt4 book ai didi

日期属性为 : error instantiating 的 R S4 类

转载 作者:行者123 更新时间:2023-12-02 03:22:52 25 4
gpt4 key购买 nike

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

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

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

这将返回以下错误:

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"



我究竟做错了什么?

最佳答案

我认为这个问题与以下事实有关,即没有 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 想到三个选项。类(class):
oblig <- setClass(
"oblig",
slots = c(name="character",issue_date="Date"))

首先,你可以实例化一个 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@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"

那里没有问题。

最后,您可以通过将列表传递给 prototype 来指定默认初始化值。 setClass 的论据:
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"

就我个人而言,我会走这条路。

关于日期属性为 : error instantiating 的 R S4 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32139846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com