我有一个 Shiny 的应用程序,可以在应用程序中绘制一些 ggplot2 图。现在我把它做成一个包并将绘图导出为一个函数。我发现一旦我在 RStudio 中绘制一些 ggplot 并启动我 Shiny 的应用程序,然后我 Shiny 的应用程序中的所有绘图都会进入 RStudio 绘图 Pane 。
我已将问题追踪到非常具体的位置,并制作了一个最小的工作示例。
这个 Shiny 的应用程序绘制了一个 ggplot,尽管它首先使用 ggsave 将 ggplot 保存为 png,然后将 ggplot 对象返回到 renderPlot,以便它显示在应用程序中。
library(shiny)
library(ggplot2)
SAVE_PLOT <- TRUE
ui <- fluidPage(fluidRow(column(12, plotOutput("plot"))))
server <- function(input, output){
output$plot <- renderPlot({
g <- ggplot(mtcars, aes(wt, mpg)) + geom_point()
if (SAVE_PLOT) {
ggsave("plot.png", g)
}
g
})
}
shinyApp(ui = ui, server = server)
如果我先在 RStudio 中运行这个简单的代码
library(ggplot2)
ggplot(mtcars, aes(wt, mpg)) + geom_point()
然后运行上面的应用程序,应用程序中的绘图显示在 RStudio 绘图窗口中。
如果我设置 SAVE_PLOT <- FALSE,那么应用程序将正确显示绘图。这表明问题是由 ggsave 引起的。
我没有尝试先绘制再保存就不会出现这个问题,因为我真实应用程序中的绘图是响应式(Reactive)的,先绘制它意味着我需要将每个绘图包装成响应式(Reactive)而不是只写在 renderPlot .
如果我在控制台中的 ggplot 之后运行 dev.off,绘图将不会转到 rstudio。尽管这显然也不是解决方案。
根据 ggsave code , 它会创建一个新设备,然后在保存后关闭当前设备。在这种情况下它是否真的搞砸了并且还关闭了 Shiny 的绘图设备?
也可以使用 Shiny 或 RStudio。
更新:问题不是特定于 RStudio,R 控制台也有同样的问题。
最佳答案
感谢@Claus Wilke 的提示,我认为我们不应该关闭当前设备,但我们可以保存设备并恢复它。
我们可以用它来解决这个问题:
library(shiny)
library(ggplot2)
SAVE_PLOT <- TRUE
ui <- fluidPage(fluidRow(column(12, plotOutput("plot"))))
server <- function(input, output){
output$plot <- renderPlot({
g <- ggplot(mtcars, aes(wt, mpg)) + geom_point()
if (SAVE_PLOT) {
cur_dev <- dev.cur()
ggsave("plot.png", g)
dev.set(cur_dev)
}
g
})
}
shinyApp(ui = ui, server = server)
感谢@wch,问题已在 ggplot2
存储库中创建,因为它是一个 ggsave
错误。
关于r - Shiny 应用程序中的 ggplot 转到 rstudio 绘图窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47699956/