小试牛刀——学会开Seurat函数“盲盒”

2022-06-26  本文已影响0人  Bio_Infor

水有源,故其流不穷;木有根,故其生不穷。

长期以来,我们的单细胞分析仅仅停留在调包套函数、……,这个过程会“蒙住”我们的眼睛,有些时候我们需要知道每个函数究竟在干什么才能够游刃有余,正如前述:水有源,故其流不穷;木有根,故其生不穷。一方面,这有利于我们的深入理解,另一方面也能给我们学习到优秀函数构建的机会。今天以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>

通过这个方法我们成功的看到了这个函数的内部结构:

方法二:使用edit()函数

edit(PercentageFeatureSet)

执行这个语句后会出现一个新的小界面,你可以在看到这个函数的内部结构的同时,手动对该函数进行编辑。在这里不赘述了。

通过上面的分析,实际上PercentageFeatureSet()函数的调用还可以用下面这种格式:
SeuratObject <- PercentageFeatureSet(SeuratObject, pattern = '^MT-', col.name = 'percent.mt')
今天又是摸鱼的一天!
上一篇下一篇

猜你喜欢

热点阅读