[英]Download plots and tables in Shiny in R; Choosing from selection of tables/plots in pickerInput
I'd like to add in a download function within my Shiny app where users can download tables (as csv) or plots (as png) as specified from a pickerInput
.我想在我的 Shiny 应用程序中添加下载 function ,用户可以在其中下载从
pickerInput
指定的表格(作为 csv)或绘图(作为 png)。 Perhaps there is a more appropriate alternative than pickerInput
which would make it easier, but here is the code that I have so far (made using the mpg
data as a reproducible minimal example):-也许有一个比
pickerInput
更合适的替代方法,它会更容易,但这是我到目前为止的代码(使用mpg
数据作为可重现的最小示例): -
#UI
ui<-fluidPage(
tabPanel("Minimal Example",
sidebarLayout(
sidebarPanel(width = 4,
pickerInput("manufacturer", "Select manufacturer",
choices = unique(mpg$manufacturer),options = list('actions-box'=TRUE, 'live-search'=TRUE), multiple = T),
pickerInput("model", "Select model",
choices = unique(mpg$model),options = list('actions-box'=TRUE, 'live-search'=TRUE), multiple = T),
pickerInput("eda_plotpick", "Select plot to save",
choices = c("Scatter plot",
"Bar plot")),
pickerInput("eda_tablepick", "Select table to save",
choices = c("mpg",
"mpg_filtered")),
actionButton("run_eda", "Run analysis"),
downloadButton("downloadplot", "Download plot"),
downloadButton("downloadtable", "Download table")),
mainPanel(
column(width = 8, box("Scatter plot", plotOutput("scatter"), width = "100%")),
column(width = 8, box("Bar plot", plotOutput("bar"), width = "100%")),
column(width = 8, box("mpg data", tableOutput("mpg"), width = "100%")),
column(width = 8, box("mpg data (filtered)", tableOutput("mpg_filter"), width = "100%"))
)
)
)#end of tabpanel
)#end of fluidpage
#SERVER
server<-function(input,output,session){
observeEvent(input$run_eda,{
output$scatter<-renderPlot({
scatterplot<-ggplot(mtcars, aes(x=wt, y=mpg)) +
geom_point(aes(size=qsec))
return(scatterplot)
})
output$bar<-renderPlot({
barplot<-ggplot(mpg,aes(y = class))+geom_bar()
return(barplot)
})
output$mpg<-renderTable({
return(mpg)
})
output$mpg_filter<-renderTable({
mpg_filtered <- mpg %>%
filter(manufacturer %in% input$manufacturer)%>%
filter(model %in% input$model)
return(mpg_filtered)
})
})#end of observe event
output$downloadtable <- downloadHandler(
filename = function() {
paste('data-', input$eda_tablepick, '.csv', sep='')
},
content = function(con) {
write.csv(data, con)
}
)
output$downloadplot <- downloadHandler(
filename = function() {
paste('plot-', input$eda_plotpick,'.png', sep='')
},
content = function(con) {
write.csv(data, con)
}
)
}#end of server
shinyApp(ui,server)
In this example, the user has a scatter plot and a bar plot.在此示例中,用户具有散点 plot 和条形 plot。 There are two tables;
有两张桌子; the full
mpg
data set and a filtered version.完整的
mpg
数据集和过滤版本。
My question is, what is the additional code that I am missing which would link the downloadHandler
functions to their respective pickerInput
functions, so that the user can specify which table or plot to download to their machine?我的问题是,我缺少哪些附加代码,它将
downloadHandler
函数链接到它们各自的pickerInput
函数,以便用户可以指定哪个表或 plot 下载到他们的机器? If there is a much simpler way of doing this (with or without pickerInput
) I would be happy to hear it:)如果有更简单的方法(有或没有
pickerInput
)我会很高兴听到它:)
This is one way to do it:这是一种方法:
#UI
ui<-fluidPage(
tabPanel("Minimal Example",
sidebarLayout(
sidebarPanel(width = 4,
pickerInput("manufacturer", "Select manufacturer",
choices = unique(mpg$manufacturer),options = list('actions-box'=TRUE, 'live-search'=TRUE), multiple = T),
pickerInput("model", "Select model",
choices = unique(mpg$model),options = list('actions-box'=TRUE, 'live-search'=TRUE), multiple = T),
pickerInput("eda_plotpick", "Select plot to save",
choices = c("Scatterplot",
"Barplot")),
pickerInput("eda_tablepick", "Select table to save",
choices = c("mpg",
"mpg_filtered")),
actionButton("run_eda", "Run analysis"),
downloadButton("downloadplot", "Download plot"),
downloadButton("downloadtable", "Download table")),
mainPanel(
column(width = 8, box("Selected plot", plotOutput("myplot"), width = "100%")),
column(width = 8, box("Selected table", tableOutput("mytable"), width = "100%"))
)
)
)#end of tabpanel
)#end of fluidpage
#SERVER
server<-function(input,output,session){
observeEvent(input$run_eda,{
plot<- reactive({
req(input$manufacturer,input$model)
if (input$eda_plotpick=="Scatterplot"){
plot<-ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point(aes(size=qsec))
}else plot<-ggplot(mpg,aes(y = class))+geom_bar()
plot
})
output$myplot <- renderPlot({
plot()
})
data <- reactive({
req(input$manufacturer,input$model)
if (input$eda_tablepick=="mpg_filtered"){
data <- mpg %>%
filter(manufacturer %in% input$manufacturer) %>%
filter(model %in% input$model)
}else data <- mpg
data
})
output$mytable <- renderTable({
data()
})
output$downloadtable <- downloadHandler(
filename = function() {
paste('data-', input$eda_tablepick, '.csv', sep='')
},
content = function(file) {
write.csv(data(), file)
}
)
output$downloadplot <- downloadHandler(
filename = function() {
paste('plot-', input$eda_plotpick,'.png', sep='')
},
content = function(con) {
png(con, units = "px")
print(plot())
dev.off()
}, contentType = 'image/png'
)
})#end of observe event
}#end of server
shinyApp(ui,server)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.