gpt4 book ai didi

Shiny :在 downloadHandler 中使用 validate()

转载 作者:行者123 更新时间:2023-12-05 02:14:25 26 4
gpt4 key购买 nike

我有一个 Shiny 应用程序,它会在单击按钮后打印报告。通过 downloadHandler() 函数创建报告。

我希望在导出报告之前有一个必填字段;合适的 Shiny 函数是 validate()(https://shiny.rstudio.com/articles/validation.html)。

但是,根据文档,validate() 函数只能在 reactive() 或 render() 函数中使用:

To use this validation test in your app, place it at the start of any reactive or render* expression that calls input$data. 

我找不到可以将此函数放在我的 downloadHandler 函数中的地方。有人知道这怎么可能吗?

这里是相关的代码部分;我希望字段“company_name”对于创建报告是强制性的。

ui <- fluidPage(

sidebarLayout(
position = "left",

sidebarPanel(

textInput(
inputId = "company_name",
label = "Company name",
value = ""
),
)
)
)

server <- function(input, output) {
output$report <- downloadHandler(
filename = "report.pdf",
content = function(file) {
# Copy the report file to a temporary directory before processing it, in
# case we don't have write permissions to the current working dir (which
# can happen when deployed).
tempReport <- file.path(tempdir(), "report.Rmd")
file.copy("report.Rmd", tempReport, overwrite = TRUE)
dir.create(file.path(tempdir(),"www"))
file.copy("www", file.path(tempdir()), recursive=TRUE)

# Set up parameters to pass to Rmd document
params <- list(company_name = input$company_name)

# Knit the document, passing in the `params` list, and eval it in a
# child of the global environment (this isolates the code in the document
# from the code in this app).

rmarkdown::render(tempReport, output_file = file,
params = params,
envir = new.env(parent = globalenv())
)
}
)
}

最佳答案

问题是 downloadButton 是一个输入小部件,而 validate 应该与输出一起使用。

如果不满足您的下载要求,我的解决方法是隐藏(或禁用)downloadButton。这可以使用 shinyjs 来完成,它允许您通过 id 隐藏或禁用按钮。

library(shiny)

ui <- fluidPage(
shinyjs::useShinyjs(),
textInput("text", "content", "", placeholder = "please insert something"),
shinyjs::hidden(downloadButton("download"))
)

server <- function(input, output, session) {
output$download <- downloadHandler(
filename = "file.csv",
content = function(file) {
write.csv(data.frame(content = input$text), file)
}
)

observeEvent(input$text, {
if (input$text == "")
shinyjs::hide("download")
else
shinyjs::show("download")
})
}

shinyApp(ui, server)

hide/show/hidden 替换为 enable/disable/disabled 以始终显示按钮,但无论何时 input$text 都无法点击> 是空的。

关于 Shiny :在 downloadHandler 中使用 validate(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53616176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com