【问题标题】:Shiny - plotlyoutput stops plotoutput from workingShiny - plotlyoutput 停止 plotoutput 工作
【发布时间】:2018-06-21 00:19:44
【问题描述】:

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

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

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

此外,地图在下一次运行时不再起作用(请参阅下面有关图形设备的评论)。

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

但是,现在地图是在 RStudio 的“绘图”面板上绘制的。

在调试时,我注意到在使用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.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()
    })

})

【问题讨论】:

    标签: r shiny r-plotly pheatmap


    【解决方案1】:

    这似乎对我有用:

     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)
    

    【讨论】:

    • 是的,这也适用于我......但为什么呢?今天早上我调查了图形设备方面,我注意到如果我在返回热图之前关闭RStudioGD 设备,它也可以工作。我将检查您的解决方案会发生什么(从图形设备的角度来看)。在此,谢谢!
    • @mic,你好,找到原因了吗?
    • 不,我并没有真正调查为什么会发生这种情况。此后,我为此类应用程序移至flexdashboard。我发现对 Rmd 笔记本进行故障排除比处理纯 Shiny 应用程序要容易得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2012-06-14
    • 2019-02-07
    • 2018-07-18
    • 2014-07-20
    • 2015-10-16
    相关资源
    最近更新 更多