Блестящий сюжет отображается в окне RStudio, а не в браузере - PullRequest
1 голос
/ 29 марта 2019

Если вы запустите следующий код в RStudio, он правильно отображает два графика, но если вы сделаете небольшое изменение (подробности ниже), он больше не будет отображать второй график.

(Обратите внимание, что examplePathwaysи exampleRanks предоставляются пакетом fgsea, поэтому следующий код должен выполняться как есть.)

library(fgsea)
library(dplyr)
library(ggplot2)
library(shiny)

ui <- fluidPage(
  plotOutput("gseaPlot"),
  plotOutput("gseaEnrichment")
)

runAnalysis <- function() {
  gseaResult <- fgsea(pathways = examplePathways, stats = exampleRanks, nperm = 10)
  topPathways <- gseaResult[NES > 0][head(order(desc(NES)), n = 10), pathway]
  topPathwayUp <- topPathways[[1]]
  gseaEnrichment <- plotEnrichment(examplePathways[[topPathwayUp]], exampleRanks)
  gseaPlot <- plotGseaTable(examplePathways[topPathways], exampleRanks, gseaResult)
  list(gseaEnrichment = gseaEnrichment, gseaPlot = gseaPlot)
}

server <- function(input, output, session) {
  theAnalysis <- runAnalysis()
  output$gseaEnrichment <- renderPlot({
    theAnalysis$gseaEnrichment
  })
  output$gseaPlot <- renderPlot({
    runAnalysis()$gseaPlot
  })
}

shinyApp(ui = ui, server = server)

Небольшое изменение заключается в том, что если я изменю второй renderPlot на использование theAnalysis вместо runAnalysis() вот так:

server <- function(input, output, session) {
  theAnalysis <- runAnalysis()
  output$gseaEnrichment <- renderPlot({
    theAnalysis$gseaEnrichment
  })
  output$gseaPlot <- renderPlot({
    theAnalysis$gseaPlot
  })
}

затем второй график неожиданно появляется в окне просмотра RStudio, а не в браузере.

Что здесь происходит, чтобы вызвать такое поведение, и как это можно сделатьЯ исправляю это, не прибегая к запуску runAnalysis() дважды?

ОБНОВЛЕНИЕ: На самом деле, следующее показывает проблему еще проще и не включает Shiny.Если я запускаю следующий код, график отображается в программе просмотра графиков RStudio, даже если он был сохранен в переменной (но это не относится к plotEnrichment):

library(dplyr)
library(fgsea)
library(ggplot2)
gseaResult <- fgsea(pathways = examplePathways, stats = exampleRanks, nperm = 10)
topPathways <- gseaResult[NES > 0][head(order(desc(NES)), n = 10), pathway]
gseaPlot <- plotGseaTable(examplePathways[topPathways], exampleRanks, gseaResult)

UPDATE: очевидно, это такне случается с fgsea версии 1.6 (я использую версию 1.8), поэтому это может быть ошибкой в ​​fgsea, поэтому я представил проблему с fgsea.Но я приветствую ответы, если кто-то может увидеть проблему или есть обходной путь.

1 Ответ

0 голосов
/ 29 марта 2019

Это было вызвано тем, что plotGseaTable вызывал grid.arrange, который выполняет рендеринг на текущее устройство.Вот почему запуск его непосредственно из реактивного контекста работал, в то время как запуск его вне реактивного контекста не помогthis:

library(grid)

...

runAnalysis <- function() {
  ...
  # The render = FALSE here (not yet available in fgsea)
  # which allows the plot to be rendered later
  gseaPlot <- plotGseaTable(examplePathways[topPathways], exampleRanks, gseaResult, render = FALSE)
  ...
}

server <- function(input, output, session) {
  theAnalysis <- runAnalysis()
  output$gseaEnrichment <- renderPlot({
    theAnalysis$gseaEnrichment
  })
  output$gseaPlot <- renderPlot({
    grid.draw(theAnalysis$gseaPlot)
  })
}

Для fgsea был сделан запрос на извлечение, чтобы разрешить это для plotGseaTable: https://github.com/ctlab/fgsea/pull/43.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...