我在我的软件包中使用{patchwork}软件包。我想利用patchwork算术运算符(即|
,\
等)。
我为我的对象类导出方法。例如:
"|.ggsurvfit" <- function(e1, e2) {
build_and_wrap(e1) | build_and_wrap(e2)
}
在上面的示例中,当传递类'ggsurvfit'的图形时,它会被处理并转换为类'ggplot',然后使用补丁方法"|.ggplot"
执行。
我遇到的问题是,用户需要将典型的ggplot与ggsurvfit图结合起来。例如p1 | p2
,其中p1具有类'ggplot',p2
具有类'ggsurvfit'。补丁包导出了正在使用的|.ggplot
方法。但我们得到了一个错误,因为|.ggplot
没有'我不知道如何处理第二个参数,即类'ggsurvfit'。
我试图写一个S3方法|.ggplot
来适当地处理第二个参数。但是我不能让任何东西工作...唉!
是否有办法通过指定的S3方法强制执行某些代码,即如何使用patchwork的|.ggplot
方法强制执行?
"|.ggplot" <- function(e1, e2) {
e2 <- build_and_wrap(e2) # process the second argument
# patch together the figures using the patwork `|.ggplot` method
withr::with_namespace(
package = "patchwork",
code = e1 | e2
)
}
2条答案
按热度按时间knpiaxh11#
S3不是为多重分派而设计的。S4是。一个原则性的方法是将
ggsurvfit
定义为ggplot
的S4子类,然后为|
(或任何其他内部通用的二元运算符)定义合适的S4方法。您的软件包的
DESCRIPTION
和NAMESPACE
文件需要相应地更改。我们可以用一个简单的例子来测试这是否有效。这里,类
a
和b
代替了类ggplot
和ggsurvfit
,S3方法|.a
代替了patchwork中的|.ggplot
:有关S3和S4混合使用的更多详细信息,您可以查看
?Methods_for_S3
,?setOldClass
和?S3Part
。qoefvg9y2#
以下方法似乎有效。
不要重载运算符
|.ggplot
,而是使用中缀运算符的标准R语法定义一个新的泛型,然后为"ggplot"
类的对象定义一个方法。创建于2022-10-14带有reprex v2.0.2
编辑
这里有另一个想法,在新的方法体中,不需要使用中缀符号来调用
patchwork:::|.ggplot
,所以,不要。创建于2022-10-14带有reprex v2.0.2