为“+;”定义data.frame方法时二进制运算符的非数字参数并在ggplot对象上使用

为“+;”定义data.frame方法时二进制运算符的非数字参数并在ggplot对象上使用,r,class,ggplot2,methods,s4,R,Class,Ggplot2,Methods,S4,我可以这样定义一个S3方法: `+.data.frame` <- function(e1,e2){"hello"} iris + iris # [1] "hello" iris+geom_point()中出错:二进制运算符的非数值参数 另外:警告消息:不兼容的方法(“+.data.frame”, “+.gg”)表示“+” 我认为这与S4方法有关,但我感到困惑。你能解释一下发生了什么事以及如何解决吗 期望输出: iris + geom_point() # [1] "hello" 这实际上

我可以这样定义一个S3方法:

`+.data.frame` <- function(e1,e2){"hello"}
iris + iris
# [1] "hello"
iris+geom_point()中出错:二进制运算符的非数值参数

另外:警告消息:不兼容的方法(“+.data.frame”, “+.gg”)表示“+”

我认为这与S4方法有关,但我感到困惑。你能解释一下发生了什么事以及如何解决吗

期望输出:

iris + geom_point()
# [1] "hello"

这实际上不是因为S4方法,而是因为方法冲突。无论是
geom_point()
还是您的数据帧都不是S4对象(
isS4
中的任何一个都返回FALSE),因此S4方法将不起作用

ggplot
包定义了
gg
类对象上的
+
方法,您刚刚定义了
data.frame
s的方法。问题在于,与大多数S3通用函数不同,
+
在选择方法时会考虑这两个参数的类。在这种情况下,它得出结论,它可以合法地选择
gg
方法以及
data.table
方法

从“Ops”(其中“+”是成员)的帮助页面:

在分派此组的任何成员时,都会考虑这两个参数的类。对于每个参数,将检查其类向量,以查看是否存在匹配的特定(首选)或Ops方法。如果只为一个参数找到了一个方法,或者为两个参数找到了相同的方法,则将使用该方法。如果找到了不同的方法,则会出现关于“不兼容方法”的警告:在这种情况下,或者如果没有为任一参数找到方法,则使用内部方法

因此,在本例中,它属于默认的
+
代码,它不知道如何添加数据帧和
gg
对象,并返回一个错误,说明了这一点


为了解决这个问题,您可以编写一个带有签名的S4方法
(data.frame,gg)
(或者
(data.frame,ANY)
,但是请注意,只有当其中一个参数是S4对象(默认情况下data.frames不是该对象)时,才会调用它。您可能必须定义自己的类,该类包含
数据.frame
(或者,包含
gg
)为了触发该方法。

请明确回答,谢谢!因此,简而言之,除非我覆盖默认方法,否则这是不可行的,在这种情况下,我仍然会收到警告。在这种情况下,我建议使用S4,在这种情况下,您可以显式指定两个参数的类。但请注意,S4方法只在“+”上被调用如果其中一个参数是S4。请更新答案以包含此信息。另请参阅此线程:它添加了有关可能转换为S4的一些详细信息
iris + geom_point()
# [1] "hello"