Ошибка "не число c" при использовании пакета перекрестных помех с EnhancedVolcano - PullRequest
1 голос
/ 12 февраля 2020

Я хотел бы реализовать функцию перекрестного разговора между таблицей и графиком в обоих направлениях:

  1. выберите строку в таблице, которая будет отражена в графике
  2. выберите точку на графике, которая будет отражена в таблице. Та же идея, что и здесь .

Мне удалось реализовать скрипт, который прекрасно работает, если я строю точечный график с ggplot() и таблицей (оба объекта встречаются друг с другом! ). Однако, когда использовались EnhancedVolcano() и таблица, я получил следующую ошибку:

Error in EnhancedVolcano(toptable = data_shared, lab = "disp", x = "qsec",  : 
  qsec is not numeric! 

Если я заменил переменную data_shared на df_orig, ошибка не возникнет, но между объектами не будет перекрестного разговора :(

Означает ли это, что SharedData$new() не распознает значения чисел c как числа чисел c? Как исправить эту ошибку?

Любая помощь высоко ценится. Спасибо

Пример игрушки:

  library(plotly)            # '4.9.1'
  library(DT)                # '0.11'
  library(crosstalk)         # ‘1.0.0’
  library(EnhancedVolcano)   # ‘1.4.0’
  # Input
  data1 = mtcars  #dim(data1)  # 32  11
  data_shared = SharedData$new(data1) #, key = c("qsec", "hp"))
  # df_orig = data_shared$origData()
  # V-Plot
  vp =EnhancedVolcano( toptable = data_shared,
                       lab  = 'disp',
                       x  =  'qsec',
                       y  =  'hp',
                       xlab  ='testX',
                       ylab = 'testY') 
  bscols(
    ggplotly(vp + aes(x= qsec, y= -log10(hp/1000))),
    datatable(data_shared, style="bootstrap", class="compact", width="100%",
              options=list(deferRender=FALSE, dom='t')))

Тот же скрипт, который работает с ggplot():

data1 = mtcars  #dim(data1)  # 32  11
data_shared = SharedData$new(data1) 
vp = ggplot(data = data_shared, mapping = aes(qsec, hp)) +
  geom_point()
bscols(
  ggplotly(vp) ,
  datatable(data_shared, style="bootstrap", class="compact", width="100%",
            options=list(deferRender=FALSE, dom='t')))

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

попытался изменить несколько вещей в функции вулкана, получил следующую ошибку:

Error in as.data.frame.default(toptable) : 
  cannot coerce class ‘c("SharedData", "R6")’ to a data.frame

пока не уверен, как это исправить.

0 голосов
/ 12 февраля 2020

Примечание: Соответствующий (тот же самый) вопрос был опубликован на BioStars , и автор пакета отправил ответ с разрешением автора, скопировав ответ здесь:


Привет,

Спасибо - это очень полезный код, и я могу добавить его в виньетку основного пакета, в конце концов.

Я попробовал его здесь на своем компьютере и смог заставить его работать в моем браузере, но некоторые компоненты оригинального сюжета, похоже, были потеряны. Я думаю, что вам просто нужно преобразовать ваш столбец ' qse c' в числовые значения.

Повторное использование примера из моей Vignette здесь Это прекрасно воспроизводимый пример:

  library("pasilla")
  pasCts <- system.file("extdata", "pasilla_gene_counts.tsv",
    package="pasilla", mustWork=TRUE)
  pasAnno <- system.file("extdata", "pasilla_sample_annotation.csv",
    package="pasilla", mustWork=TRUE)
  cts <- as.matrix(read.csv(pasCts,sep="\t",row.names="gene_id"))
  coldata <- read.csv(pasAnno, row.names=1)
  coldata <- coldata[,c("condition","type")]
  rownames(coldata) <- sub("fb", "", rownames(coldata))
  cts <- cts[, rownames(coldata)]
  library("DESeq2")
  dds <- DESeqDataSetFromMatrix(countData = cts,
    colData = coldata,
    design = ~ condition)

  featureData <- data.frame(gene=rownames(cts))
  mcols(dds) <- DataFrame(mcols(dds), featureData)
  dds <- DESeq(dds)
  res <- results(dds)

  library(EnhancedVolcano)
  p1 <- EnhancedVolcano(res,
    lab = rownames(res),
    x = "log2FoldChange",
    y = "pvalue",
    pCutoff = 10e-4,
    FCcutoff = 2,
    xlim = c(-5.5, 5.5),
    ylim = c(0, -log10(10e-12)),
    pointSize = c(ifelse(res$log2FoldChange>2, 8, 1)),
    labSize = 4.0,
    shape = c(6, 6, 19, 16),
    title = "DESeq2 results",
    subtitle = "Differential expression",
    caption = "FC cutoff, 1.333; p-value cutoff, 10e-4",
    legendPosition = "right",
    legendLabSize = 14,
    col = c("grey30", "forestgreen", "royalblue", "red2"),
    colAlpha = 0.9,
    drawConnectors = TRUE,
    hline = c(10e-8),
    widthConnectors = 0.5)

  p1 <- p1 +
    ggplot2::coord_cartesian(xlim=c(-6, 6)) +
    ggplot2::scale_x_continuous(
      breaks=seq(-6,6, 1))

  library(plotly)
  library(DT)
  library(crosstalk)  

  bscols(
    ggplotly(p1 + aes(x= log2FoldChange, y= -log10(pvalue))),
      datatable(
        data.frame(res),
        style="bootstrap",
        class="compact", width="100%",
        options=list(deferRender=FALSE, dom='t')))

enter image description here

К сожалению, заговор и / или bscols don Мне не нравится использование bquote(), поэтому нельзя иметь причудливые имена осей, которые я использую в EnhancedVolcano :

... + xlab(bquote(~Log[2] ~ "fold change")) + ylab(bquote(~-Log[10] ~ italic(P)))

Когда я пытаюсь добавить их, выдается ошибка.

Кевин

...