水有源,故其流不穷;木有根,故其生不穷。
长期以来,我们的单细胞分析仅仅停留在调包
、套函数
、……,这个过程会“蒙住”我们的眼睛,有些时候我们需要知道每个函数究竟在干什么才能够游刃有余,正如前述:水有源,故其流不穷;木有根,故其生不穷。一方面,这有利于我们的深入理解,另一方面也能给我们学习到优秀函数构建的机会。今天以PercentageFeatureSet()函数为例来进行分享。
PercentageFeatureSet()函数
不知道大家注意到没有,Seurat
包里面的很多函数在对 SeuratObject 进行操作时,都是如下的格式:
SeuratObject <- function(SeuratObject, operation...)
简单来看就是函数对SeuratObject操作后产生的结果直接赋值给原SeuratObject。
但是PercentageFeatureSet()函数似乎不是这样(以计算线粒体基因含量为例):
SeuratObject[['percent.mt']] <- PercentageFeatureSet(SeuratObject, pattern = '^MT-')
计算产生的结果是赋给了SeuratObject的metadata的新的一列。那么为什么会是这样?或者说PercentageFeatureSet()函数能用其它函数那样的调用格式来进行使用吗?这一切都要求我们知道PercentageFeatureSet()函数的具体内容。
下面来看如何开函数盲盒,给大家提供两种方法:
方法一:直接调用函数(不加参数)
PercentageFeatureSet
############ following is the result ############
function (object, pattern = NULL, features = NULL, col.name = NULL,
assay = NULL)
{
assay <- assay %||% DefaultAssay(object = object)
if (!is.null(x = features) && !is.null(x = pattern)) {
warning("Both pattern and features provided. Pattern is being ignored.")
}
features <- features %||% grep(pattern = pattern, x = rownames(x = object[[assay]]),
value = TRUE)
percent.featureset <- colSums(x = GetAssayData(object = object,
assay = assay, slot = "counts")[features, , drop = FALSE])/object[[paste0("nCount_",
assay)]] * 100
if (!is.null(x = col.name)) {
object <- AddMetaData(object = object, metadata = percent.featureset,
col.name = col.name)
return(object)
}
return(percent.featureset)
}
<bytecode: 0x000002488cdb0de0>
<environment: namespace:Seurat>
通过这个方法我们成功的看到了这个函数的内部结构:
- 首先关注这句
percent.featureset <- colSums(x = GetAssayData(object = object, assay = assay, slot = "counts")[features, , drop = FALSE])/object[[paste0("nCount_", assay)]] * 100
,它至少告诉我们两个信息:首先,percent.featureset是一个某些基因表达占比的数值向量;其次,这个数值是百分比,而不是小数。 - 进一步关注这句:
if (!is.null(x = col.name)) { object <- AddMetaData(object = object, metadata = percent.featureset, col.name = col.name) return(object) }
,这句的意思是,如果我们在调用PercentageFeatureSet()函数时添加了col.name参数时,这个函数就会返回一个SeuratObject,这里的col.name参数就是新的metadata列的列名。反之如果没有指定col.name,就只会返回一个percent.featureset的比例数值向量,自然需要我们指定metadata新列的信息。
方法二:使用edit()函数
edit(PercentageFeatureSet)
执行这个语句后会出现一个新的小界面,你可以在看到这个函数的内部结构的同时,手动对该函数进行编辑。在这里不赘述了。
通过上面的分析,实际上PercentageFeatureSet()函数的调用还可以用下面这种格式:
SeuratObject <- PercentageFeatureSet(SeuratObject, pattern = '^MT-', col.name = 'percent.mt')
网友评论