У меня странная ошибка. Не знаю, из-за 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()
})
})