问题描述
我的闪亮应用程序的目的是让用户导入一个 excel 文件,应用程序将显示表格(经过一些数据操作)。用户还可以下载并保存表格,使用他们指定的任何名称。
代码运行良好。但是,当我决定添加另一个 tabPanel 时,下载按钮在第一个面板中工作正常,但只在第二个面板中下载 HTML,而不是导入的表格。如果不清楚,您可以复制代码并尝试运行它。第二个面板只下载页面的 HTML。
为什么它会在第二个面板中下载 HTML,而相同的代码在第一个面板中运行得很好?
界面:
ui <- fluidPage(
tabsetPanel(
tabPanel("Panel1",sidebarLayout(
sidebarPanel(fileInput("df1","Import File",accept = ".xlsx"),textInput('df1sheet','Sheet Name (Case-Sensitive)'),actionButton("update","Update")),mainPanel(tableOutput("table1"),useShinyjs(),actionButton("download","Download Table"),conditionalPanel(
"false",downloadButton("downloadtable")
),useshinyalert())
)),tabPanel("Panel2",sidebarLayout(
sidebarPanel(fileInput("df2",textInput('df2sheet',actionButton("update2",mainPanel(tableOutput("table2"),actionButton("download2",downloadButton("downloadtable2")
),useshinyalert())
))
)
)
服务器:
server <- function(input,output) {
## Code for Panel 1
df1 <- eventReactive(input$update,{
input$df1$datapath
})
df1sheet <- eventReactive(input$update,{
input$df1sheet
})
data1 <- reactive({
req(input$df1)
req(df1sheet())
read_excel(df1(),sheet = df1sheet())
})
output$table1 <- renderTable({data1()})
## User can press on actionButton (id: download),and shinyalert will pop up,asking
## for a filename input. After pressing confirmButton,runjs will click on
## downloadButton and trigger downloadHandler.
observeEvent(input$download,{
shinyalert("Save as:",type = "input",size = "xs",cloSEOnesc = TRUE,cloSEOnClickOutside = TRUE,showConfirmButton = TRUE,showCancelButton = TRUE,confirmButtonText = "Save",confirmButtonCol = "#0075B8",animation = TRUE)
})
output$downloadtable <- downloadHandler(
filename = function () {paste(input$shinyalert,".csv",sep = "")},content = function(file) {write.csv(data1(),file)}
)
observeEvent(input$shinyalert,{
if (input$shinyalert != FALSE) {
shinyjs::runjs("$('#downloadtable')[0].click();")
}
})
## Code for Panel 2
df2 <- eventReactive(input$update2,{
input$df2$datapath
})
df2sheet <- eventReactive(input$update2,{
input$df2sheet
})
data2 <- reactive({
req(input$df2)
req(df2sheet())
read_excel(df2(),sheet = df2sheet())
})
output$table2 <- renderTable({data2()})
## User can press on actionButton (id: download),runjs will click on
## downloadButton and trigger downloadHandler.
observeEvent(input$download2,animation = TRUE,inputId = "shinyalert2")
})
output$downloadtable2 <- downloadHandler(
filename = function () {paste(input$shinyalert2,content = function(file) {write.csv(data2(),file)}
)
observeEvent(input$shinyalert2,{
if (input$shinyalert2 != FALSE) {
shinyjs::runjs("$('#downloadtable2')[0].click();")
}
})
}
解决方法
您在 LATEST
中的第二个 downloadButton
似乎是问题所在。
替换
conditionalPanel
有了这个
conditionalPanel(
"false",downloadButton("downloadtable2")
),