【问题标题】:why does initializing an R S4 class with a data.table slot not work if the variable is not provided如果未提供变量,为什么使用 data.table 插槽初始化 R S4 类不起作用
【发布时间】:2017-10-06 14:20:38
【问题描述】:

我正在尝试创建一个包含 data.table 的对象,如果新语句中没有提供任何数据,我希望将其初始化为空的 data.table。但是,如果我忽略它,我会收到一条错误消息。

我尝试使用 data.frame 代替,这很好,但我想了解下面最后一个新语句中出了什么问题,因为前 2 个新语句是好的?

library(data.table)

setClass("TmpClass", slots = c(v1 = "character", v2 = "data.frame"))
new("TmpClass", v1 = "I work")
# An object of class "TmpClass"
# Slot "v1":
#   [1] "I work"
# 
# Slot "v2":
#   data frame with 0 columns and 0 rows

setClass("JunkClass", slots = c(v1 = "character", v2 = "data.table"))
new("JunkClass", v1 = "I work as well", v2 = data.table(a = 1, b = 2))
# An object of class "JunkClass"
# Slot "v1":
#   [1] "I work as well"
# 
# Slot "v2":
#    a b
# 1: 1 2

new("JunkClass", v1 = "hmm, i get an error")
# Error in validObject(.Object) : 
#   invalid class “JunkClass” object: invalid object for slot "v2" in class 
# "JunkClass": got class "list", should be or extend class "data.table"

【问题讨论】:

  • 我从未使用过 S4,但这似乎工作正常:setClass("junk", slots = c(v1 = "character", v2 = "data.table"), prototype = list(v1 = character(0), v2 = data.table(NULL))); new("junk", v1 = "eh?")
  • 很好,所以添加原型解决了它。谢谢!如果有人能解释我的例子中发生的事情,那就太好了。

标签: r initialization data.table s4


【解决方案1】:

我认为这里一个好的解决方案是正式承认@v2 插槽可以是NULL

library(data.table)
setClassUnion("nullOrDatatable", c("NULL", "data.table"))
setClass("JunkClass", slots = c(v1 = "character", v2 = "nullOrDatatable"))
new("JunkClass", v1 = "No more error!")
# An object of class "JunkClass"
# Slot "v1":
#   [1] "No more error!"
# 
# Slot "v2":
#   NULL

【讨论】:

    猜你喜欢
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多