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

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

长期以来,我们的单细胞分析仅仅停留在调包套函数、……,这个过程会“蒙住”我们的眼睛,有些时候我们需要知道每个函数究竟在干什么才能够游刃有余,正如前述:水有源,故其流不穷;木有根,故其生不穷。一方面,这有利于我们的深入理解,另一方面也能给我们学习到优秀函数构建的机会。今天以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')
今天又是摸鱼的一天!
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容