|
讲了S4,查看类别,会用help
## Dependencies
This document has the following dependencies:
[AppleScript] 纯文本查看 复制代码
```{r dependencies, warning=FALSE, message=FALSE}
library(ALL)
library(GenomicRanges)
```
## Overview
R中的S4系统是面向对象编程的系统。 令人困惑的是,R支持至少3种面向对象编程的不同系统:S3,S4和S5(也称为参考类)。
S4系统在生物导体中大量使用,而在“传统”R和CRAN的包装中非常轻微地使用。 作为一个用户,识别S4对象可以是有用的,并且在遇到S4类和方法时学习一些有关如何探索,操纵和使用帮助系统的事实。
让我们来看一个S3对象,输出基线R中的线性模型函数`lm`:
[AppleScript] 纯文本查看 复制代码 ```{r lm}
df <- data.frame(y = rnorm(10), x = rnorm(10))
lm.object <- lm(y ~ x, data = df)
lm.object
names(lm.object)
class(lm.object)
```
在标准的R中, S3对象是重要的list有一个类属性,S3的问题是我们可以将任何类赋予任何的list,这样的话说不通
[AppleScript] 纯文本查看 复制代码 ```{r lm2}
xx <- list(a = letters[1:3], b = rnorm(3))
xx
class(xx) <- "lm"
xx
```
S4类有正式的定义和可靠的检测,一下是一个S4对象
[AppleScript] 纯文本查看 复制代码
```{r ALL}
library(ALL)
data(ALL)
ALL
class(ALL)
isS4(ALL)
```
最后一个函数是查看这个对象是否为 S4类.
## Constructors and getting help
help!
[AppleScript] 纯文本查看 复制代码 ```{r help, eval=FALSE}
?"ExpressionSet-class"
class?ExpressionSet
```
.
用结构函数建立基础类
```{r list}
xx <- list(a = 1:3)
```
```{r ExpressionSet}
ExpressionSet()
```
help
```{r help2,eval=FALSE}
?ExpressionSet
```
new() 也可以建立类,但是不常有
[AppleScript] 纯文本查看 复制代码 ```{r newExpressionSet}
new("ExpressionSet")
```
## Slots and accessor functions
可以通过以下的函数得到类
[AppleScript] 纯文本查看 复制代码 ```{r getClass}
getClass("ExpressionSet")
```
在这个输出中你会看到两件事
1.一些`slots`与名称和`class`一起提及。
2.类“直接”扩展“eSet”类。
首先,让我们讨论(1)。 S4类中的数据被组织成slots。 您可以使用“@”或“slots()”函数来访问slots
[AppleScript] 纯文本查看 复制代码 ```{r slots}
ALL@annotation
slot(ALL, "annotation")
```
[AppleScript] 纯文本查看 复制代码 ```{r accessor}
annotation(ALL)
```
但是,作为一个用户,你不应该直接访问slots**。 这很重要。 您应该使用 "accessor"功能获取数据。 通常,访问器函数被命名为slot,或者称为“get”和slot名称。
```{r accessor}
annotation(ALL)
```
[AppleScript] 纯文本查看 复制代码 更新
```{r updateObject, eval=FALSE}
new_object <- updateObject(old_object)
```
In practice, you tend to not want to keep the `old_object` around so you do
```{r updateObject2, eval=FALSE}
object <- updateObject(object)
```
检测是否为S4类
```{r validity}
validObject(ALL)
```
## S4方法
您可以将S4方法视为简单的功能。 一种方法是可以查看其参数并决定要做的功能。 模拟方法的一种方法是通过以下函数定义
[AppleScript] 纯文本查看 复制代码 ```{r mimicMethod}
mimicMethod <- function(x) {
if (is(x, "matrix"))
method1(x)
if (is(x, "data.frame"))
method2(x)
if (is(x, "IRanges"))
method3(x)
}
```
检测 `x` 并且执行不同的代码 (`method1`, `method2`, `method3`) 取决于`x` 是什么.
例子`as.data.frame`.
[AppleScript] 纯文本查看 复制代码 ```{r as.data.frame}
as.data.frame
```
下面是可用的一些方法
```{r showMethods}
showMethods("as.data.frame")
```
以上是用来展示x的值的方法。
可以用一下方法查看代码
[AppleScript] 纯文本查看 复制代码 ```{r getMethod}
getMethod("as.data.frame", "DataFrame")
```
Lingo - `as.data.frame`是一个通用的方法。 它对不同签名(“x”的值)进行操作,每个签名都具有相关联的方法。 这种方法据说是在“x”上“调度”。
许多Bioconductor包广泛使用S4类,并采用S4方法; 我倾向于遵循这个范例。 S4方法特别有用
1.如果需要处理的参数(比如`as.data.frame`),有很多不同的值。
2.你想模仿基本的功能
第二点就是例如“r Biocpkg(”IRanges“)”和“Biocpkg(”GenomicRanges“)包。 “IRanges”类看起来非常像一个标准的向量,并且广泛的工作已经使它像一个标准的向量。
对于`as.data.frame`,如下
[AppleScript] 纯文本查看 复制代码 ```{r base_as.data.frame}
base::as.data.frame
```
```
The following objects are masked from 'package:base':
Filter, Find, Map, Position, Reduce, anyDuplicated, append,
as.data.frame, as.vector, cbind, colnames, do.call, duplicated,
eval, evalq, get, intersect, is.unsorted, lapply, mapply, match,
mget, order, paste, pmax, pmax.int, pmin, pmin.int, rank, rbind,
rep.int, rownames, sapply, setdiff, sort, table, tapply, union,
unique, unlist, unsplit
```
查找方法的帮助页面的正确方法是
[AppleScript] 纯文本查看 复制代码 ```{r helpMethod,eval=FALSE}
method?as.data.frame,DataFrame
?"as.data.frame-method,DataFrame"
```
当多个参数调用时,showMethods就意义不大了。下面是一个很好的例子
[AppleScript] 纯文本查看 复制代码 ```{r findOverlaps}
showMethods("findOverlaps")
```
`findOverlaps`也是一个例子,其中通用的两个不同的方法具有不同的参数,尽管说明当参数是“GRanges”而不是“IRanges”时,“findOverlaps”只接受`ignore.strand' 。 运用函数之前需要查看帮助
[AppleScript] 纯文本查看 复制代码 ```{r ignore.strand}
getMethod("findOverlaps", signature(query = "Ranges", subject = "Ranges"))
getMethod("findOverlaps", signature(query = "GenomicRanges", subject = "GenomicRanges"))
```
|
|