背景
我有一个reactive
,它既用于渲染输出,又用于downloadHandler
。在此reactive
中,如果有问题,我使用validate
向render*
函数发出信号。但是,这在downloadHandler
中造成了问题。在下面的应用中,如果输入未通过验证,浏览器将显示“ HTTP 500内部服务器错误”(IE)或“失败-服务器问题”(Chrome)-参见。屏幕截图。
所需结果
我想首先找到一种避免这种行为的方法。我已阅读Validate inside downloadHandler和Shiny: use validate() inside downloadHandler,并且两者都建议在出现问题时隐藏/更改下载按钮。那么observer
无效时将触发的reactive
会是什么样子?
注意。由于reactive
本身封装在模块中,并且该模块无法访问我的{ {1}}。
代码
downloadHandler
答案 0 :(得分:1)
您可以使用show
软件包中的hide
和shinyjs
函数-
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
numericInput("n", "n", 0, -3, 3),
downloadLink('downloadData', 'Download')
)
server <- function(input, output, session) {
r <- reactive({
validate(need(input$n >= 0, "value is smaller than zero"))
as.character(input$n)
})
output$downloadData <- downloadHandler(
filename = function() {
paste('data-', Sys.Date(), '.txt', sep='')
},
content = function(con) {
writeLines(isolate(r()), con)
}
)
observe({
## if i could react whenever r() is invalid
## I could simply hide the download button here
## tryCatch(r(), ...) did not work
if(input$n < 0) {
hide(id = "downloadData")
} else {
show(id = "downloadData")
}
})
}
shinyApp(ui, server)
答案 1 :(得分:1)
我找到了解决方案。尽管tryCatch
不能按预期工作,但我发现了try
的解决方案:
observe({
res <- try(handler$reactive_i_cannot_change_because_the_code_does_not_belong_2_me(), TRUE)
if ("try-error" %in% class(res)) {
print("disable")
}
})