如果没有提供变量,为什么使用data.table插槽初始化R S4类不起作用

如果没有提供变量,为什么使用data.table插槽初始化R S4类不起作用,r,initialization,data.table,s4,R,Initialization,Data.table,S4,我正在尝试创建一个包含data.table的对象,如果new语句中没有提供data.table,则希望将其初始化为空data.table。然而,如果我忽略它,我会收到一条错误消息 我试着用data.frame代替它,这很好,但我想了解下一个新的station中出现了什么问题,因为前两个新station都很好 library(data.table) setClass("TmpClass", slots = c(v1 = "character", v2 = "data.frame")) new("

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

我试着用data.frame代替它,这很好,但我想了解下一个新的station中出现了什么问题,因为前两个新station都很好

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"

我认为一个很好的解决方案是正式识别
@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

我从未使用过S4,但它似乎工作得很好:
setClass(“垃圾”,slots=c(v1=“character”,v2=“data.table”),prototype=list(v1=character(0),v2=data.table(NULL));新的(“垃圾”,v1=“eh?”)
Nice,所以添加原型解决了这个问题。非常感谢。不过,如果有人能解释一下我的例子,那就太好了。