为什么“$”自动完成适用于 BioConductor 的 S4 class "SummarizedExperiment"

Why "$" autocompletion works for S4 class "SummarizedExperiment" from BioConductor

我很难理解自动完成功能如何适用于 BioConductor 中名为 "SummarizedExperiment" 的定制 S4 class。

这是从 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 控制台中按 tab 时,它会自动完成 $:

的可能名称
rse$<tab>
rse$Treatment

为什么会这样?我以为 R 只为列表自动完成 $

Tab 完成的实现是通过 S3 通用 ?.DollarNames。对于 SummarizedExperiment,relevant method

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

近似地,当按下 tab 键时,R 查找模式 x$foo<tab>,发现 x 是一个 SummarizedExperiment,因此查找 .DollarNames.SummarizedExperiment 进行评估,通过 x 作为第一个参数,foo 作为第二个参数,提供由方法完成的 return。

相比之下,当按下 return 回车 x$foo<cr> 时,R 发现您正试图在 x 上调用 $,因此查找 ( S4) $.

的方法