GGR绘图对象是否可以存储在S4插槽中?

GGR绘图对象是否可以存储在S4插槽中?,r,ggplot2,s4,R,Ggplot2,S4,我试图在S4插槽中保存ggplot对象 考虑: library(stats4) library(ggplot2) setClass("gginS4", contains = c("ggplot"), slots = c( p = "ggplot")) 允许通过gginS4@p。我对其他类别的数据(即“sf”等)使用了这种方法,没有问题。但是,上述示例会产生以下错误: Error in reco

我试图在S4插槽中保存ggplot对象

考虑:

library(stats4)
library(ggplot2)

setClass("gginS4",
      contains = c("ggplot"),
      slots = c(
        p = "ggplot"))
允许通过
gginS4@p
。我对其他类别的数据(即“sf”等)使用了这种方法,没有问题。但是,上述示例会产生以下错误:

Error in reconcilePropertiesAndPrototype(name, slots, prototype, superClasses,  : 
  no definition was found for superclass “ggplot” in the specification of class “gginS4”

使用
ggplot2::ggplot()
创建的对象有两个类
gg
ggplot
,但是
setClass()
找不到这两个超类的定义。是否有其他方法来定义插槽?

让我们更深入地了解是什么导致了这种情况

library(ggplot2)
isS3method("ggplot") # FALSE ,it means it is an S3 generic for more details: ?isS3method
您正在尝试创建一个使用S3 OO系统实现的
ggplot
generic插槽,因此由于两个系统之间不兼容,该插槽将无法工作。若要将其存储在S4插槽中,请使用
setOldClass

setOldClass
:将旧样式(又称“S3”)类注册为正式定义的类

所以最终的代码应该是这样的

library(ggplot2)
setOldClass(c("gg", "ggplot"))
setClass("gginS4",contains = "ggplot",
         slots = c(p = "ggplot"))

让我们更深入地了解一下是什么导致了这种情况

library(ggplot2)
isS3method("ggplot") # FALSE ,it means it is an S3 generic for more details: ?isS3method
您正在尝试创建一个使用S3 OO系统实现的
ggplot
generic插槽,因此由于两个系统之间不兼容,该插槽将无法工作。若要将其存储在S4插槽中,请使用
setOldClass

setOldClass
:将旧样式(又称“S3”)类注册为正式定义的类

所以最终的代码应该是这样的

library(ggplot2)
setOldClass(c("gg", "ggplot"))
setClass("gginS4",contains = "ggplot",
         slots = c(p = "ggplot"))
ggplot
是一个泛型对象,因此显然不是S3或S4对象。但是,您是对的,您需要调用
setOldClass
在S4对象中使用S3对象
ggplot
是一个泛型对象,因此显然不是S3或S4对象。但是,您是对的,您需要调用
setOldClass
在S4对象中使用S3对象