问题
在通过input
删除控件时,如何删除/使相应的removeUI
元素无效?
您可以在下面的reprex
中看到,即使删除textInput
之后,input$x
仍然是“真实的”。理想情况下,我可以告诉shiny
,input$x
不再有效,任何依赖reactives
的{{1}}都将其视为空。
更新
阅读到目前为止的答案,我想我还不清楚我要实现的目标。我真的很想知道一个人是否可以在概念上“废除” input$x
。在这种情况下,我不必担心会发生故障。
代表
input$x
答案 0 :(得分:1)
您可以使用reactiveValues
作为打印输出,并在删除div时将其分配为NULL。我不知道是否有更优雅的解决方案。
library(shiny)
ui <- fluidPage(
div(textInput("x", "Text"), id = "killme"),
actionButton("del", "Delete"),
verbatimTextOutput("out")
)
server <- function(input, output) {
textX <- reactiveValues(x = NULL)
observe({
textX$x = input$x
})
observeEvent(input$del, {
textX$x = NULL
removeUI("#killme")
})
output$out <- renderPrint({
req(textX$x)
textX$x
})
}
shinyApp(ui, server)
答案 1 :(得分:1)
此SO question显示了如何使输入无效。这样,解决方案将变为:
ui <- fluidPage(
tags$script("
Shiny.addCustomMessageHandler('resetValue', function(variableName) {
Shiny.onInputChange(variableName, null);
});
"),
div(textInput("x", "Text"), id = "killme"),
actionButton("del", "Delete"),
verbatimTextOutput("out")
)
server <- function(input, output, session) {
output$out <- renderPrint(req(input$x))
observeEvent(input$del, {
removeUI("#killme")
session$sendCustomMessage("resetValue", "x")})
}
shinyApp(ui, server)
尽管感谢您的回答,但由于有了讨论,我可以使我的问题更清楚,并能够找到正确的解决方案。
使用library(shinyjs)
的简短形式:
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(debug = TRUE),
div(textInput("x", "Text"), id = "killme"),
actionButton("del", "Delete"),
verbatimTextOutput("out")
)
server <- function(input, output, session) {
output$out <- renderPrint(req(input$x))
observeEvent(input$del, {
removeUI("#killme")
runjs('Shiny.onInputChange("x", null)')
})
}
shinyApp(ui, server)