【问题标题】:ggplot in shiny app go to rstudio plot window闪亮应用程序中的 ggplot 转到 rstudio 绘图窗口
【发布时间】:2018-05-21 20:23:03
【问题描述】:

我有一个闪亮的应用程序,可以在应用程序中绘制一些 ggplot2 图。现在我将它制作成一个包并将绘图导出为一个函数。我发现一旦我在 RStudio 中绘制了一些 ggplot 并启动了我的闪亮应用程序,然后我闪亮应用程序中的所有绘图都进入了 RStudio 绘图窗格。

我已将问题追踪到非常具体的位置,并制作了一个最小的工作示例。

这个闪亮的应用程序绘制了一个 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

我没有尝试是否先绘制并稍后保存不会有这个问题,因为我的真实应用程序中的情节是反应性的,首先绘制它意味着我需要将每个情节包装成反应性而不是仅仅写在renderPlot .

如果我在控制台中的 ggplot 之后运行 dev.off,则绘图不会转到 rstudio。虽然这显然也不是解决方案。

根据ggsave code, 它创建一个新设备,然后在保存后关闭当前设备。有没有可能在这种情况下它真的搞砸了并关闭了闪亮的绘图设备?

也可以使用 Shiny 或 RStudio。

更新:这个问题不是 RStudio 特有的,R 控制台也有同样的问题。

【问题讨论】:

  • 问题在于ggsave()调用的函数ggplot_gtable()(通过print())。如果您构建一个 ggplot 图,那么事情可能会变得一团糟,而且我还没有找到解决方法。我写了一些非常烦人的代码here (l. 14-25) 来解决这个问题。基本上我强迫人们在启动闪亮的应用程序之前关闭所有图形设备。
  • 感谢您的确认。我看一下相关代码。不应该是这样的。
  • 我已经在ggsave():github.com/tidyverse/ggplot2/issues/2363 中提交了一个关于该错误的问题。我怀疑问题不在于ggplot_gtable(),而在于ggsave() 中设备的打开和关闭。
  • @wch 是的,你是对的。我遇到过类似的问题,我使用的是ggplot_gtable() 而不是ggsave(),但在这种情况下ggsave() 是罪魁祸首。

标签: r ggplot2 shiny rstudio


【解决方案1】:

感谢@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 repo 中创建,因为它是ggsave 错误。

【讨论】:

  • 谢谢,这似乎是一般的解决方案。它也适用于我的情况。
【解决方案2】:

pdf(NULL); ggsave(...); dev.off() 中包含ggsave() 函数似乎在这里提供了一种解决方法,尽管有时图形设备在关闭应用程序时处于奇怪的状态。

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) {
      pdf(NULL)
      ggsave("plot.png", g)
      dev.off()
    }
    g
  })
}
qplot(1:10, 1:10) # shows up in R Studio window
shinyApp(ui = ui, server = server) # shows up in shiny window

【讨论】:

  • 是的,此后设备状态不正确,我发现控制台中的新绘图不会绘制到绘图窗口。
  • 我发现保存和恢复设备可以解决问题。你可以试试看它会解决你的问题。
猜你喜欢
  • 2016-12-20
  • 2019-08-20
  • 2013-07-02
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 2016-12-01
  • 2013-07-24
相关资源
最近更新 更多