闪亮-plotlyOutput停止plotoutput工作

时间:2018-06-21 00:19:45

标签: r shiny r-plotly pheatmap

我遇到一个奇怪的错误。我不知道是因为Shiny还是Pheatmap或RStudio还是密谋。

我需要在同一Shiny应用程序中显示一个来自pheatmap的情节和另一个情节(带有renderPlotly)。两者必须位于不同的navBars上,并且仅在按下按钮时才需要显示。

如果我绘制热图,然后绘制热图,然后返回热图,则当我按下生成热图的按钮时,热图就会消失。

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

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

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

在调试时,我注意到使用plotlyOutout时,周围有 rogue 图形设备。例如,当使用plotOutput时,在plot(map_reactive)的{​​{1}}处使用断点,server.R显示为“ NULL”。
在相同的断点,使用dev.list()时,plotlyOutput显示:

dev.list()

使用dev.off()关闭设备在调试过程中无济于事(我不完全了解调试作用域的工作原理),但是如果我在停止应用程序后执行此操作,一切将再次正常工作。

这是代码:

UI:

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

服务器:

# 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")
               )
             ))
  )

)

1 个答案:

答案 0 :(得分: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)