我想定义自己的行为(方法),用于将data.frame与新S3类的对象相乘.但我无法弄清楚如何让方法调度以找到我的方法.有办法吗?
首先,我定义S3对象'a'(oldClass"A")和'df'(oldClass"data.frame"):
a <- 4
oldClass(a) <- "A"
df <- data.frame(x=1:2,y=3:4)
Run Code Online (Sandbox Code Playgroud)
然后我使用trace(Ops.data.frame,edit = TRUE)在第一行添加print("Ops.data.frame").这样,我知道何时调用Ops.data.frame.这是一个演示:
a*df
# [1] "Ops.data.frame"
# x y
# 1 4 12
# 2 8 16
Run Code Online (Sandbox Code Playgroud)
我可以为类"A"定义一个S3方法.
Ops.A <- function(e1, e2) {
print("Ops.A")
oldClass(e1) <- oldClass(e1)[oldClass(e1) != "A"]
oldClass(e2) <- oldClass(e2)[oldClass(e2) != "A"]
callGeneric(e1, e2)
}
Run Code Online (Sandbox Code Playgroud)
这被称为a而不是 df:
# This successfully calls Ops.A
a*a
# [1] "Ops.A"
# [1] 16
# But this throws an error
a*df
# Error in a * df : non-numeric argument …
Run Code Online (Sandbox Code Playgroud)