Блестящий - plotlyoutput останавливает работу plotoutput

У меня странная ошибка. Не знаю, из-за Shiny, pheatmap, RStudio или plotly.

Мне нужно показать график, полученный из pheatmap, и другой график (с renderPlotly) в том же приложении Shiny. Эти два должны быть на разных навигационных панелях, и они должны отображаться только тогда, когда я нажимаю кнопку.

Если я построю тепловую карту, затем построю график, а затем вернусь к тепловой карте, тепловая карта исчезнет, ​​как только я нажму кнопку, которая должна ее сгенерировать.

Также карта больше не работает при следующих запусках (см. Комментарий к графическим устройствам ниже).

Этого не произойдет, если я использую для графика обычный plotOutput вместо plotlyOutput (и renderPlotly).

Однако теперь карта отображается на панелях «Графики» RStudio.

Во время отладки я заметил, что при использовании plotlyOutout есть мошеннические графические устройства. Например, при использовании plotOutput, при использовании точки останова в plot(map_reactive) в server.R, 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()
    })

})

person mic    schedule 21.06.2018    source источник


Ответы (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)
person MLavoie    schedule 21.06.2018
comment
Да, у меня это тоже работает ... но почему ??? Этим утром я исследовал аспект графических устройств и заметил, что он также работает, если я выключу устройство RStudioGD перед возвратом тепловой карты. Я проверю, что будет с вашим решением (с точки зрения графических устройств). А пока спасибо! - person mic; 21.06.2018