作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 S3 方法,我想使用任何 R 对象,包括 S4 对象。
我不明白的第一件事是 S4 类似乎不是从 S4 基类派生的,所以给定 f <- function(x) UseMethod("f")
我不能只声明 f.S4
dispatch 方法并让它拾取所有 S4 对象。 (虽然如果你 unclass
是一个 S4 对象,它似乎被赋予了类 S4
。)我应该如何管理调度?
似乎处理这些 S4 对象的最简单方法是将它们转换为列表。不幸的是,as.list
抛出一个错误(“没有将这个 S4 类强制为向量的方法”)。
这是我的测试 S4 对象:
library(gWidgetstcltk)
win <- gwindow()
S3Part
和
S3Class
在
methods
包看起来很有希望,但是当我在
win
上使用它们时它们都会抛出错误.所以,问题 2 是:是否有将 S4 对象转换为列表的通用方法?
最佳答案
S4 是一个不能直接用于调度的父类(super class)(虚拟类,无论如何,请有人用正确的名称插话)。顺便说一句,S3 也一样。您可以像处理 S3 类一样为 S4 类进行 S3 调度。在旁注中,如果未指定任何内容,则调用 myfun
在 S4 对象上只会导致 .default 函数。 :
myfun <- function(object, ...) UseMethod("myfun")
myfun.default <- function(object,...){
cat("default method.\n")
print(object)
}
myfun.gWindow <- function(object,...){
cat("Here here...")
print(object)
}
x <- 1:10
myfun(x)
myfun(win)
rm(myfun.gWindow)
myfun(win)
isS4()
.在 .default 函数中添加调度允许自动 S3 调度到某些 S4 类。如果将其添加到泛型中,则只需派发到所有 S4 no-matter-what :
myfun.default <- function(object,...){
if(isS4(object)) myfun.S4(object,...)
else {
cat("default method.\n")
print(object)
}
}
myfun.S4 <- function(object,...){
cat("S4 method\n")
print(object)
}
x <- 1:10
myfun(x)
myfun(win)
gWindow
是一个特例。尝试使用
str(win)
时也会返回错误。 .我不知道确切的结构,但它绝对不是一个普通的 S4 对象。
关于oop - 如何让 S3 方法与 S4 对象一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5913083/
我是一名优秀的程序员,十分优秀!