gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:30:39 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com