我遇到一个奇怪的错误。我不知道是因为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")
)
))
)
)
答案 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)