GGR绘图对象是否可以存储在S4插槽中?
我试图在S4插槽中保存ggplot对象 考虑: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
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对象