使用removeUI时删除相应的输入元素

时间:2018-07-25 09:38:07

标签: r shiny

问题

在通过input删除控件时,如何删除/使相应的removeUI元素无效?

您可以在下面的reprex中看到,即使删除textInput之后,input$x仍然是“真实的”。理想情况下,我可以告诉shinyinput$x不再有效,任何依赖reactives的{​​{1}}都将其视为空。

更新

阅读到目前为止的答案,我想我还不清楚我要实现的目标。我真的很想知道一个人是否可以在概念上“废除” input$x。在这种情况下,我不必担心会发生故障。


代表

input$x

2 个答案:

答案 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)