没有反应性数据时如何禁用downloadButton?

How to disable downloadButton when there is no reactive data?

提问人:Kansas Keeton 提问时间:11/17/2023 最后编辑:Kansas Keeton 更新时间:11/17/2023 访问量:34

问:

我在互联网上搜索了这方面的帮助,但没有找到我需要满足我特定需求的东西。

我正在设计一个应用程序,用户上传多个文件,这些文件存储在列表中并进行操作,然后用户下载生成的 .xlsx 文件。

如果存储文件的列表为空,我想禁用。问题是,该函数似乎无法识别它,因为它是反应式的。下面是一个示例:downloadButton()observe()

library(shiny)
library(purrr)

ui <- fluidPage(
  fileInput("site",
            accept = "csv",
            multiple = TRUE),
  actionButton("submit", "Submit"),
  downloadButton("download", "Download")
)

server <- function(input, output, session) {

  
  files_list <- eventReactive(input$submit, {
    files <- req(input$submit)
    data <- map(files$datapath, read.csv)
    dataSplit <- split(data, ceiling(seq_along(data)/23))
    dataSplit
  })
  
  observe({
    shinyjs::toggleState("download", condition = length(files_list() != 0)) # this doesn't work
  })
  
  
}

shinyApp(ui, server)

有没有办法禁用该反应列表为空?downloadButton()

非常感谢!

r 闪亮

评论

0赞 stefan 11/17/2023
尝试使用 .此外,用作变量名称或函数名称或响应式名称是一个糟糕的选择,因为它与 R 函数冲突。也许会是一个更好的选择。length( list() ) != 0listlist()files_list
0赞 kansasliketheband 11/17/2023
啊对不起,在我的应用程序中,它的名字不同,我在这里使用只是为了方便 - 刚刚编辑了 OP。我尝试了你的建议,可悲的是这不是问题。list

答:

1赞 stefan 11/17/2023 #1

您的代码存在几个问题。除了我在评论中已经提到的在您的状况中错误放置括号的小问题之外,您还必须添加到 UI 才能使用 .其次,a 需要 .按原样,您的代码会导致错误。第三,你必须使用.您的文件路径不会存储在操作按钮中。最后,问题不在于您的情况会导致错误,因为只有在按下按钮后才会初始化。也许有更好的选择,但我想出的唯一选择是使用辅助设备来存储您的病情状态。shinyjs::useShinyjs()shinyjsfileInputlabelfiles <- req(input$site)files_listreactivefiles_list()submitreactiveVal()

library(shiny)
library(purrr)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  fileInput(
    "site",
    NULL,
    accept = "csv",
    multiple = TRUE
  ),
  actionButton("submit", "Submit"),
  downloadButton("download", "Download")
)

server <- function(input, output, session) {
  enable_download <- reactiveVal(value = FALSE)
  
  files_list <- eventReactive(input$submit, {
    files <- req(input$site)
    data <- map(files$datapath, read.csv)
    dataSplit <- split(data, ceiling(seq_along(data) / 23))
    dataSplit
  })

  observe({
    req(files_list())
    enable_download(length(files_list()) != 0)
  })
  
  observe({
    toggleState(
      id = "download",
      condition = enable_download()
    )
  })
}

shinyApp(ui, server)
#> 
#> Listening on http://127.0.0.1:8717

评论

0赞 kansasliketheband 11/17/2023
这看起来会起作用!为我的代码道歉 - 我试图使一个更容易消化的 reprex,但显然错过了一些重要的步骤。当我回到工作岗位时,我会让你知道情况如何!