在 RShiny 中使用 renderPrint/renderText 在 downloadHandler 中缺少预期文件时显示错误
In RShiny using renderPrint/renderText to show error when expected files are missing in downloadHandler
我在一个闪亮的应用程序中使用 downloadHandler,它让我下载 4 个已创建的反应性数据帧。如果尚未创建任何一个数据框,我想包含一个功能,然后将在 renderPrint/renderText 中打印,表示缺少一个数据框。下面给出了服务器代码中的一个最小示例,但它没有按照我想要的方式工作。
output$dl <-
if((df1()!= '') || (df2()!='') || (df3()!= '') || (df4()!= '') ){
downloadHandler(
filename = "New_Data.xlsx",
content = function(file){
write_xlsx(list("S1" = df1(), "S2" = df2(), "S3" = df3(), "S4" = df4()), path = file)
}else{
output$dl_error <- renderPrint({'One of the dataframes is missing'})
}
)
或类似这样的东西
data_list <- reactive({
list("S1" = df1(),
"S2" = df2(),
"S3" = df3(),
"S4" = df4())
})
output$dl <- reactive({
if(length(data_list()==4)){
downloadHandler(
filename = "New_Data.xlsx",
content = function(file){
write_xlsx(data_list(), path = file)
}
)
}else{
output$dl_error <- renderPrint({'One of the dataframes is missing'})
}
})
如果有人能帮我解决这个问题就太好了。此外,如果 renderPrint/renderText 中的错误消息显示缺少哪个数据帧会更好。
正如我在评论中所说,您可以禁用该按钮。您可以使用 shinyjs 包轻松地做到这一点。另一种选择是使用 conditionalPanel
隐藏下载按钮。这是第三种选择。我用 conditionalPanel
隐藏了下载按钮,而是显示了一个“假”下载按钮。当数据框可用时,假数据按钮被隐藏,真正的下载按钮变得可见。如果用户点击假的下载按钮,他会被告知数据框不可用并带有警报。
library(shiny)
library(shinyalert)
library(writexl)
ui <- fluidPage(
useShinyalert(),
br(),
conditionalPanel(
condition = "!output.ok",
actionButton("fake", "Download", icon = icon("save"))
),
conditionalPanel(
condition = "output.ok",
style = "display: none;",
downloadButton("dwnld", "Download", icon = icon("save"))
),
br(),
actionButton("databtn", "Generate dataframe")
)
server <- function(input, output, session){
observeEvent(input[["fake"]], {
shinyalert(
title = "Error!",
text = "The dataframe is not ready yet",
type = "error"
)
})
df <- reactiveVal(NULL)
observeEvent(input[["databtn"]], {
df(iris)
})
output[["ok"]] <- reactive({
!is.null(df())
})
outputOptions(output, "ok", suspendWhenHidden = FALSE)
output[["dwnld"]] <- downloadHandler(
filename = "iris.xlsx",
content = function(file){
write_xlsx(list(iris = df()), path = file)
}
)
}
shinyApp(ui, server)
我在一个闪亮的应用程序中使用 downloadHandler,它让我下载 4 个已创建的反应性数据帧。如果尚未创建任何一个数据框,我想包含一个功能,然后将在 renderPrint/renderText 中打印,表示缺少一个数据框。下面给出了服务器代码中的一个最小示例,但它没有按照我想要的方式工作。
output$dl <-
if((df1()!= '') || (df2()!='') || (df3()!= '') || (df4()!= '') ){
downloadHandler(
filename = "New_Data.xlsx",
content = function(file){
write_xlsx(list("S1" = df1(), "S2" = df2(), "S3" = df3(), "S4" = df4()), path = file)
}else{
output$dl_error <- renderPrint({'One of the dataframes is missing'})
}
)
或类似这样的东西
data_list <- reactive({
list("S1" = df1(),
"S2" = df2(),
"S3" = df3(),
"S4" = df4())
})
output$dl <- reactive({
if(length(data_list()==4)){
downloadHandler(
filename = "New_Data.xlsx",
content = function(file){
write_xlsx(data_list(), path = file)
}
)
}else{
output$dl_error <- renderPrint({'One of the dataframes is missing'})
}
})
如果有人能帮我解决这个问题就太好了。此外,如果 renderPrint/renderText 中的错误消息显示缺少哪个数据帧会更好。
正如我在评论中所说,您可以禁用该按钮。您可以使用 shinyjs 包轻松地做到这一点。另一种选择是使用 conditionalPanel
隐藏下载按钮。这是第三种选择。我用 conditionalPanel
隐藏了下载按钮,而是显示了一个“假”下载按钮。当数据框可用时,假数据按钮被隐藏,真正的下载按钮变得可见。如果用户点击假的下载按钮,他会被告知数据框不可用并带有警报。
library(shiny)
library(shinyalert)
library(writexl)
ui <- fluidPage(
useShinyalert(),
br(),
conditionalPanel(
condition = "!output.ok",
actionButton("fake", "Download", icon = icon("save"))
),
conditionalPanel(
condition = "output.ok",
style = "display: none;",
downloadButton("dwnld", "Download", icon = icon("save"))
),
br(),
actionButton("databtn", "Generate dataframe")
)
server <- function(input, output, session){
observeEvent(input[["fake"]], {
shinyalert(
title = "Error!",
text = "The dataframe is not ready yet",
type = "error"
)
})
df <- reactiveVal(NULL)
observeEvent(input[["databtn"]], {
df(iris)
})
output[["ok"]] <- reactive({
!is.null(df())
})
outputOptions(output, "ok", suspendWhenHidden = FALSE)
output[["dwnld"]] <- downloadHandler(
filename = "iris.xlsx",
content = function(file){
write_xlsx(list(iris = df()), path = file)
}
)
}
shinyApp(ui, server)