Почему автодополнение "$" работает для класса S4 "SummarizedExperiment" от BioConductor - PullRequest
0 голосов
/ 24 августа 2018

Мне трудно понять, как может работать автозаполнение для пользовательского класса S4 в BioConductor, который называется SummarizedExperiment.

Вот короткая демонстрация, взятая из 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]]
})

Тем не менее, когда я нажимаю tab в консоли R, он автоматически заполняет возможные имена для $:

rse$<tab>
rse$Treatment

Почему это происходит? Я думал, что R только автозаполнение $ для списков.

1 Ответ

0 голосов
/ 24 августа 2018

Реализация табуляции завершается через S3 generic ?.DollarNames.Для SummarizedExperiment соответствующий метод *1003* равен

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

Приблизительно, когда клавиша табуляции нажата, R ищет шаблон x$foo<tab>, находит, что x является SummarizedExperiment, ипоэтому ищет .DollarNames.SummarizedExperiment для оценки, передавая x в качестве первого аргумента и foo в качестве второго, предлагая завершения, возвращаемые методом.

В отличие от этого, когда нажата клавиша возврата x$foo<cr>, R видит, что вы пытаетесь вызвать $ на x, и поэтому ищет (S4) метод для $.

...