【发布时间】: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()是罪魁祸首。