搜索
查看: 6878|回复: 0

[basic] S4

[复制链接]

64

主题

138

帖子

681

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
681
发表于 2017-7-3 09:35:02 | 显示全部楼层 |阅读模式

讲了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"))
```




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号-2  

GMT+8, 2023-6-9 20:11 , Processed in 0.120422 second(s), 32 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.