我有一个闪亮的应用程序,在应用程序中绘制一些ggplot2图。现在我将它变成一个包并将绘图绘图导出为一个函数。我发现一旦我在RStudio中绘制一些ggplot并启动我的闪亮应用程序,然后我闪亮的应用程序中的所有绘图都会转到RStudio绘图窗格。
我已将问题追踪到非常具体的位置,并制作了一个最小的工作示例。
这个闪亮的应用程序绘制了一个ggplot,虽然它首先将ggplot保存到带有ggsave的png中,然后将ggplot对象返回到renderPlot,以便它显示在app中。
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()
然后运行上面的应用程序,app中的情节显示在RStudio情节窗口中。
如果我设置SAVE_PLOT&lt; - FALSE,则应用程序将正确显示绘图。这表明问题是由ggsave引起的。
我没有先尝试绘图并稍后保存它不会有这个问题,因为我的真实应用程序中的绘图是反应性的,首先绘制它意味着我需要将每个绘图包装成一个被动反应而不是只在renderPlot中写入
如果我在控制台中的ggplot之后运行dev.off,则情节不会转到rstudio。虽然这显然不是解决方案。
根据ggsave code, 它会创建一个新设备,然后在保存后关闭当前设备。它是否有可能在这种情况下搞砸了并关闭了闪亮的绘图设备呢?
也可以使用Shiny或者使用RStudio。
更新:问题不是特定于RStudio,R控制台也有同样的问题。
答案 0 :(得分:2)
感谢@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
错误。
答案 1 :(得分:0)
将ggsave()
函数包含在pdf(NULL); ggsave(...); dev.off()
中似乎提供了一种解决方法,但有时图形设备在关闭应用时处于奇怪的状态。
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