我有一个简单的示例 Siny 代码,可以正常工作(如下)。它生成几个微小数据帧的列表(server.R 中的反应对象“myout”)。数据帧的数量基于用户的输入。('NumRuns')。
我当前的代码允许用户通过 ui.R 中的 downloadButton 和 server.r 中的 downloadHandler 下载这些数据帧中的第一个。
我想知道是否可以围绕 downloadButton 和 downloadHandler 创建一个循环,以便在运行分析(actionButton)后,用户获得与“myout”中生成的数据帧一样多的下载按钮。有可能吗?
或者也许可以创建一个下载按钮,允许用户“选择”他/她想要下载哪个数据帧?
非常感谢您的任何提示 - 因为我不知道如何处理它!
我的代码(我使用以下命令运行它:runApp(launch.browser = T)
### My ui.R code:
shinyUI(pageWithSidebar(
headerPanel("My App"),
sidebarPanel(
numericInput('NumRuns','Number of runs',value=3,min=3,max=10,step=1),
br(),
actionButton(inputId="goButton","Run!"),
br(),
br(),
textInput("downloadData","Save My Data Frame:",value="Data Frame 1"),
downloadButton('downloadData','Save my file!')
),
mainPanel(
tabsetPanel(
tabPanel("Shows the 1st data frame",tableOutput("mydf"))
)
)
))
### My 'server.R' code:
shinyServer(function(input,output){
### Creating files for displaying and downloading
myout = reactive({
if(input$goButton==0) return(NULL)
nrruns=input$NumRuns
mylist=NULL
for(i in 1:nrruns){
mylist[[i]]<-data.frame(a=rnorm(10),b=runif(10))
names(mylist)[i]<-paste("dataframe",i,sep="")
}
return(mylist)
})
# Grabbing only the 1st data frame:
output$mydf <- renderTable({
if(input$goButton==0) return(NULL)
myout()$dataframe1
})
# Allowing to download only the 1st data frame:
output$downloadData <- downloadHandler(
filename = function() { paste(input$downloadData, " ",Sys.Date(),".csv",sep="") },
content = function(file) {
write.csv(myout()$dataframe1,file,row.names=F)
}
)
})