r - Shiny 应用程序中的 ggplot 转到 rstudio 绘图窗口

标签 r ggplot2 shiny rstudio

我有一个 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/

相关文章:

r - R ggplot geom.tile 函数中手动选择 bin 大小?

javascript - 使用嵌入的 javascript 将 cookie 读入 Shiny 应用程序

html - 使用 HTML 或 CSS 居中对齐 Shiny box header

r - 如何使用 R 中的热图绘制混淆矩阵?

r - 从 R 中数值向量的每个元素中提取第一个数字

r - ggplot2::coord_cartesian 在方面

r - R-geom_density()使用哪种算法,以及如何提取曲线的点/等式?

r - 像observe()一样的reactive()中的优先级值(R Shiny)

r - (统计)2路表标准化

r - 如何让 ESS 默认水平拆分窗口?