r-从shinyapp下载许多情节



问题:

我有大量的数据,我正在尝试为我的用户可视化。这可能是几百个情节。在目前的应用程序中,我正在使用facet_wrap制作ggplot2的小倍数,这可以很好地处理大约100个绘图。然而,我希望用户能够将所有的绘图导出为他们所做的记录,并且能够可视化所有的绘图,而不仅仅是前100个。我不太担心它的格式(即作为ggforce::facet_wrap_paginate((或完全独立的绘图,如下所示(。

我已经尝试了几种关于堆栈溢出的方法,但似乎什么都不起作用

如果我尝试导出R中的绘图,但我无法在shine中获得下载,则以下代码可以工作。


library(shiny)
library(ggplot2)
ui <- fluidPage(
downloadButton("plot_download", "Download all plots"),
plotOutput("facet_plot")
)
server <- function(input, output) {



data <- reactive({

data.frame(group = rep(LETTERS, each = 100),
x = runif(n = 20, min = 10, max = 15),
y = runif(n = 20, min = 100, max = 150))

})


output$facet_plot <- renderPlot({
data() |>
ggplot(aes(x,y)) +
geom_point() +
facet_wrap(vars(group))

})


output$plot_download <- downloadHandler(
filename = function() {
paste0(Sys.Date(), "_plot.pdf")
},
content = function(file) {
pdf(file)
data() |>
split(by="group") |>
lapply(function(data) {
gg <- data |>
ggplot(aes(x,y)) +
geom_point() 
})
dev.off()
}
)


}

shinyApp(ui = ui, server = server)

您可以使用ggsave函数,而不是调用pdf函数。它将使用参数widthheightdpiunits以所需格式保存输出。你可以在这里找到文档。

代码将如下所示:

library(shiny)
library(ggplot2)
ui <- fluidPage(

downloadButton("plot_download", "Download all plots"),
plotOutput("facet_plot")
)
server <- function(input, output) {
data <- reactive({
data.frame(group = rep(LETTERS, each = 100),
x = runif(n = 20, min = 10, max = 15),
y = runif(n = 20, min = 100, max = 150))
})

output$facet_plot <- renderPlot({
data() %>%
ggplot(aes(x,y)) +
geom_point() +
facet_wrap(vars(group))
})

output$plot_download <- downloadHandler(
filename =  function() {
paste0(Sys.Date(), "_plot.pdf", sep = '')
},
content = function(file) {
ggsave(file, data() %>% ggplot(aes(x, y)) + geom_point()+ facet_wrap(~group), dpi = 300)
} 
)
}
shinyApp(ui = ui, server = server)

p.S:我在你的代码中到处更改了一些内容。保存绘图的代码应与以前的代码一起使用。

EDIT为了根据您的需要扩展解决方案,我对代码进行了一些更改。有一个包叫ggforce。你可以在这里找到它。它将帮助您将facet_wrap中的绘图保存为单个页面上的单独图形,或以行和列的方式保存。

以下是代码的样子:

filename =  function() {
paste0(Sys.Date(), "_plot.pdf", sep = '')
},
content = function(file) {
pdf(file)
#ggsave(file, data() %>% ggplot(aes(x, y)) + geom_point()+ facet_wrap(~group), dpi = 300)
for(i in 1:length(unique(data()$group))) {
print(data() %>% ggplot(aes(x, y)) + geom_point() + 
facet_wrap_paginate(~group, ncol = 1, nrow = 1, page = i))
}
dev.off()
} 

请注意,我使用的是基于您的示例数据的for group。你可以根据自己的需要进行更改。facet_wrap_paginate是您需要的函数。您可以指定要在每页上保存的绘图的列数和行数。

最新更新