我很难理解自动完成如何适用于 BioConductor 中名为“SummarizedExperiment”的定制 S4 类。

这是取自 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 作为第二个参数传递,提供方法返回的完成。

相反,当按下回车 x$foo<cr> 时,R 会发现您正在尝试在 $ 上调用 x ,因此会查找 $ 的 (S4) 方法。

关于r - 为什么 "$"自动完成功能适用于 BioConductor 的 S4 类 "SummarizedExperiment",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52000053/

10-11 01:39