我想对下载按钮进行条件检查btnDownload。如果特定数据recData$dfData()框没有数据,则单击下载按钮时,它必须显示警告:“由于没有数据,无法下载报告。”
observeEvent(input$btnDownload, {
if (nrow(recData$dfData()) != 0) {
output$btnDownload <- downloadHandler(
"rpa foundary.docx",
content = function(file) {
trycatch(
expr = {
if (file.exists("rpa foundary.docx")) {
file.remove("rpa foundary.docx")
}
mydoc <- CreateReportDoc(recData$dfData(), recData$dfProjectWeeklyDtls())
print(mydoc, file)
print(mydoc, file, target = "rpa foundary.docx")
shinyalert(
type = "success",
title = "download complete!",
text = paste0("report downloaded successfully")
)
}, error = function(e) {
logerror(e, fxname = "btnDownload", app = "server.r")
}, warning = function(w){
logwarning(w, fxname = "btnDownload", app = "server.r")
}
)}## downloader
)} else {
shinyalert(
type = "error", title = "report cannot be downloaded!",
text = paste0("no data available to display")
)
}
})
Run Code Online (Sandbox Code Playgroud)
我期待只有在recData$dfData()没有数据时才发出警报。但我正在![c:Libraries\Pictures\dwnld.png]下载 html 文档。
正如@DSGym 所建议的,当数据不可用时,我宁愿禁用该按钮。我们还可以添加工具提示以向用户提供信息。
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
br(),br(),
div(id="dwnbutton",
downloadButton("downloadData", "Download", disabled = "disabled")
),
br(), br(),
actionButton("go", "Go")
)
server <- function(input, output) {
# Our dataset - empty at initialisation
data <- reactiveVal(data.frame())
observeEvent(input[["go"]], {
data(mtcars)
})
observeEvent(data(), {
if(nrow(data()) > 0){
enable("downloadData")
runjs("$('#dwnbutton').removeAttr('title');")
}else{
disable("downloadData")
runjs("$('#dwnbutton').attr('title', 'Data not available');")
}
})
output$downloadData <- downloadHandler(
filename = function() {
paste("data-", Sys.Date(), ".csv", sep="")
},
content = function(file) {
write.csv(data(), file)
}
)
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
如果你真的想要一个警报,这里有一个方法。
library(shiny)
library(shinyjs)
library(shinyWidgets)
ui <- fluidPage(
useShinyjs(),
br(),br(),
div(id="dwnbutton",
downloadButton("downloadData", "Download",
onclick = "Shiny.setInputValue('dwnClicked', true, {priority:'event'});")
),
br(), br(),
actionButton("go", "Go")
)
server <- function(input, output, session) {
# Our dataset - empty at initialisation
data <- reactiveVal(data.frame())
observeEvent(input[["go"]], {
data(mtcars)
})
observeEvent(data(), {
if(nrow(data()) > 0){
runjs("$('#dwnbutton').off('click.x');")
}else{
runjs("$('#dwnbutton').on('click.x', function(e){e.preventDefault();});")
}
})
observeEvent(input[["dwnClicked"]], {
if(nrow(data()) == 0){
sendSweetAlert(
session = session,
title = "No data !",
text = "No data available",
type = "error"
)
}
})
output$downloadData <- downloadHandler(
filename = function() {
paste("data-", Sys.Date(), ".csv", sep="")
},
content = function(file) {
write.csv(data(), file)
}
)
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
但至少我会为按钮添加一个样式以显示数据不可用:
observeEvent(data(), {
if(nrow(data()) > 0){
runjs("$('#dwnbutton').off('click.x');")
runjs("$('#downloadData').removeClass('btn-danger');")
}else{
runjs("$('#dwnbutton').on('click.x', function(e){e.preventDefault();});")
runjs("$('#downloadData').addClass('btn-danger');")
}
})
Run Code Online (Sandbox Code Playgroud)