在RStudio窗口而不是浏览器中显示闪亮的图

时间:2019-03-29 15:53:00

标签: r ggplot2 shiny

如果在RStudio中运行以下代码,它将正确显示两个图,但是,如果进行了较小的更改(在下面进行详细说明),它将不再显示第二个图。

(注意examplePathwaysexampleRanks由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)

更新:显然,这在fgsea 1.6版(我使用的是1.8版)中不会发生,因此这可能是fgsea中的错误,因此我提交了fgsea问题。但是,如果有人看到问题或有解决方法,我欢迎您回答。

1 个答案:

答案 0 :(得分:0)

这是由于plotGseaTable正在调用grid.arrange(这会渲染到当前设备)这一事实引起的。这就是为什么直接从反应性上下文运行它而不能在反应性上下文外部运行它的原因。

解决方案是让plotGseaTable返回grob,然后在反应性上下文中呈现它,如下所示:

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