提问人:Kansas Keeton 提问时间:11/17/2023 最后编辑:Kansas Keeton 更新时间:11/17/2023 访问量:34
没有反应性数据时如何禁用downloadButton?
How to disable downloadButton when there is no reactive data?
问:
我在互联网上搜索了这方面的帮助,但没有找到我需要满足我特定需求的东西。
我正在设计一个应用程序,用户上传多个文件,这些文件存储在列表中并进行操作,然后用户下载生成的 .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()
非常感谢!
答:
1赞
stefan
11/17/2023
#1
您的代码存在几个问题。除了我在评论中已经提到的在您的状况中错误放置括号的小问题之外,您还必须添加到 UI 才能使用 .其次,a 需要 .按原样,您的代码会导致错误。第三,你必须使用.您的文件路径不会存储在操作按钮中。最后,问题不在于您的情况会导致错误,因为只有在按下按钮后才会初始化。也许有更好的选择,但我想出的唯一选择是使用辅助设备来存储您的病情状态。shinyjs::useShinyjs()
shinyjs
fileInput
label
files <- req(input$site)
files_list
reactive
files_list()
submit
reactiveVal()
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,但显然错过了一些重要的步骤。当我回到工作岗位时,我会让你知道情况如何!
评论
length( list() ) != 0
list
list()
files_list
list