代码之家  ›  专栏  ›  技术社区  ›  Karolis Koncevičius

为什么“$”自动完成适用于生物导体的S4类“总结实验”

  •  3
  • Karolis Koncevičius  · 技术社区  · 7 年前

    下面是一个简短的演示 example(SummarizedExperiment)

    library(SummarizedExperiment)
    
    nrows <- 200; ncols <- 6
    counts <- matrix(runif(nrows * ncols, 1, 1e4), nrows)
    
    rowRanges <- GRanges(rep(c("chr1", "chr2"), c(50, 150)),
                         IRanges(floor(runif(200, 1e5, 1e6)), width=100),
                         strand=sample(c("+", "-"), 200, TRUE),
                         feature_id=sprintf("ID%03d", 1:200))
    
    colData <- DataFrame(Treatment=rep(c("ChIP", "Input"), 3), row.names=LETTERS[1:6])
    
    rse <- SummarizedExperiment(assays=SimpleList(counts=counts),
                                rowRanges=rowRanges, colData=colData)
    

    现在这个对象是:

    > structure(rse)
    class: RangedSummarizedExperiment
    dim: 200 6
    metadata(0):
    assays(1): counts
    rownames: NULL
    rowData names(1): feature_id
    colnames(6): A B ... E F
    colData names(1): Treatment
    

    似乎有自己的通用 $ LINK :

    setMethod("$", "SummarizedExperiment",
        function(x, name)
    {
        colData(x)[[name]]
    })
    

    制表符 在R控制台中,它自动完成 :

    rse$<tab>
    rse$Treatment
    

    为什么会这样?我以为R只是自动完成的 $ 对于列表。

    1 回复  |  直到 7 年前
        1
  •  4
  •   Martin Morgan    7 年前

    tab补全的实现是通过S3泛型 ?.DollarNames relevant method

    .DollarNames.SummarizedExperiment <- function(x, pattern = "")
        grep(pattern, names(colData(x)), value=TRUE)
    

    大约,当按下tab键时,R查找模式 x$foo<tab> x 是一个总结性的实验,所以寻找 .DollarNames.SummarizedExperiment 评估,通过 作为第一个论点 foo

    相反,当按下回车键时 x$foo<cr> $ ,因此寻找(S4)方法 $

    推荐文章