闪亮 - plotlyoutput 停止 plotoutput 工作

Shiny - plotlyoutput stops plotoutput from working

我遇到了一个奇怪的错误。不知道是因为Shiny,还是pheatmap,还是RStudio,还是plotly。

我需要在同一个 Shiny 应用程序中显示来自 pheatmap 的图和另一个图(renderPlotly)。两者必须在不同的导航栏上,并且只有在我按下按钮时它们才需要显示。

如果我绘制 pheatmap,然后绘制 plotly 图表,然后返回热图,只要按下应该生成它的按钮,热图就会消失。

此外,该地图在接下来的运行中不再有效(请参阅下面关于图形设备的评论)。

如果我对图表使用普通的 plotOutput 而不是 plotlyOutput(和 renderPlotly),则不会发生这种情况。

但是,现在地图绘制在 RStudio 的 "Plots" 面板上。

调试时,我注意到在使用plotlyOutout时,周围有流氓图形设备。例如,当使用 plotOutput 时,在 server.R 中使用 plot(map_reactive) 处的断点,dev.list() 显示 "NULL".
在同一个断点处,当使用plotlyOutput时,dev.list()显示:

Browse[2]> dev.list()
    RStudioGD quartz_off_screen quartz_off_screen 
            2                 3                 4 

使用 dev.off() 关闭设备在调试期间没有帮助(我不完全知道调试范围是如何工作的),但如果我在停止应用程序后这样做,一切都会再次运行。

这是代码:

UI:

# ui.R

library(shiny)
library(plotly)

shinyUI(
  navbarPage("Test",
             selected = 'map',
    tabPanel('map', 
             sidebarLayout(
      sidebarPanel('side',
                   actionButton('getHmap', 'get heatmap')
                   ),
      mainPanel('main',
                plotOutput("themap")
                )
    )),
    tabPanel('plot', 
             sidebarLayout(
               sidebarPanel('side',
                            actionButton('getPlot', 'getPlot')
               ),
               mainPanel('main',
                         plotlyOutput("theplot")
               )
             ))
  )

)

服务器:

# server.R

library(shiny)
library(pheatmap)

shinyServer(
  function(input, output, session) {

    map_reactive = eventReactive(input$getHmap,{
      tmp = data.frame(matrix(1:20,5,4))
      tmpmap = pheatmap(tmp, silent = T)
      tmpmap$gtable
    })

    output$themap = renderPlot({
      plot(map_reactive())
    })

    plot_reactive = eventReactive(input$getPlot,{
      return(ggplot(data.table(x=1:10, y=1:10), aes(x=x,y=y))+
               geom_point()
             )
    })

    output$theplot = renderPlotly({
      plot_reactive()
    })

})

这似乎对我有用:

 ui = navbarPage("Test",
                selected = 'map',
                tabPanel('map', 
                         sidebarLayout(
                           sidebarPanel('side',
                                        actionButton('getHmap', 'get heatmap')
                           ),
                           mainPanel('main',
                                     plotOutput("themap")
                           )
                         )),
                tabPanel('plot', 
                         sidebarLayout(
                           sidebarPanel('side',
                                        actionButton('getPlot', 'getPlot')
                           ),
                           mainPanel('main',
                                     plotlyOutput("theplot")
                           )
                         ))
)

server = function(input, output, session) {

  observeEvent(input$getHmap, {

    tmp = data.frame(matrix(1:20,5,4))
    tmpmap = pheatmap(tmp, silent = T)

  output$themap = renderPlot({        
    tmpmap
  })

  })

  plot_reactive = eventReactive(input$getPlot,{
    return(ggplot(data.table(x=1:10, y=1:10), aes(x=x,y=y))+
             geom_point()
    )
  })

  output$theplot = renderPlotly({
    plot_reactive()
  })     
}

shinyApp(ui, server)