在 RShiny 中,当 downloadHandler 中缺少预期文件时,使用 renderPrint/renderText 显示错误

Posted

技术标签:

【中文标题】在 RShiny 中,当 downloadHandler 中缺少预期文件时,使用 renderPrint/renderText 显示错误【英文标题】:In RShiny using renderPrint/renderText to show error when expected files are missing in downloadHandler 【发布时间】:2021-11-22 23:48:09 【问题描述】:

我在一个闪亮的应用程序中使用 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 中的错误消息显示缺少哪个数据框会更好。

【问题讨论】:

我不知道该怎么做。我宁愿禁用下载按钮,直到四个 df 可用。 如何像您提议的那样禁用下载按钮,因为这也可以解决我的问题,如果可能的话,当用户单击禁用的下载按钮时会显示一条消息,告诉用户文件不可用? 【参考方案1】:

正如我在评论中所说,您可以禁用该按钮。您可以使用 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)

【讨论】:

这帮助我解决了我的问题。感谢您的帮助!

以上是关于在 RShiny 中,当 downloadHandler 中缺少预期文件时,使用 renderPrint/renderText 显示错误的主要内容,如果未能解决你的问题,请参考以下文章

RShiny中表格的条件格式

在 RShiny 的数据表的第二页中禁用 selectizeInput

我可以从服务器中的反应函数中获得 UI 中的 SelectInput 的选择吗? (RShiny)[重复]

Rshiny:如何将 renderUI 输出传递给 Selectinput 中的 chocies 参数

Rshiny:我想让用户选择 3 个图表

根据 rshiny 中的用户输入更改图中因子的顺序