闪亮 - plotlyoutput 停止 plotoutput 工作
Shiny - plotlyoutput stops plotoutput from working
我遇到了一个奇怪的错误。不知道是因为Shiny,还是pheatmap,还是RStudio,还是plotly。
我需要在同一个 Shiny 应用程序中显示来自 pheatmap 的图和另一个图(renderPlotly
)。两者必须在不同的导航栏上,并且只有在我按下按钮时它们才需要显示。
如果我绘制 pheatmap,然后绘制 plotly 图表,然后返回热图,只要按下应该生成它的按钮,热图就会消失。
此外,该地图在接下来的运行中不再有效(请参阅下面关于图形设备的评论)。
如果我对图表使用普通的 plotOutput
而不是 plotlyOutput
(和 renderPlotly),则不会发生这种情况。
但是,现在地图绘制在 RStudio 的 "Plots" 面板上。
调试时,我注意到在使用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:
# 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()
})
})
这似乎对我有用:
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)
我遇到了一个奇怪的错误。不知道是因为Shiny,还是pheatmap,还是RStudio,还是plotly。
我需要在同一个 Shiny 应用程序中显示来自 pheatmap 的图和另一个图(renderPlotly
)。两者必须在不同的导航栏上,并且只有在我按下按钮时它们才需要显示。
如果我绘制 pheatmap,然后绘制 plotly 图表,然后返回热图,只要按下应该生成它的按钮,热图就会消失。
此外,该地图在接下来的运行中不再有效(请参阅下面关于图形设备的评论)。
如果我对图表使用普通的 plotOutput
而不是 plotlyOutput
(和 renderPlotly),则不会发生这种情况。
但是,现在地图绘制在 RStudio 的 "Plots" 面板上。
调试时,我注意到在使用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:
# 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()
})
})
这似乎对我有用:
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)