小编pan*_*gia的帖子

在S3*data.frame上调度自定义方法

我想定义自己的行为(方法),用于将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)

r r-s3

6
推荐指数
1
解决办法
270
查看次数

标签 统计

r ×1

r-s3 ×1