通过闪亮的removeUI()函数删除actionButton()

时间:2018-09-07 02:48:45

标签: r shiny

我正在尝试使用闪亮包中的help(removeUI)函数,但是在删除特定元素时遇到了一些困难。下面是此问题的一个示例,与textInput(中的示例略有不同。具体来说,包含actionButton(的注释行被library(shiny) ui <- fluidPage( sidebarPanel( actionButton("rmv", "Remove UI"), actionButton("txt", "This is no longer useful") #textInput("txt", "This is no longer useful") ) ) # Server logic server <- function(input, output, session) { observeEvent(input$rmv, { removeUI( selector = "div:has(> #txt)" ) }) } # Complete app with UI and server components shinyApp(ui, server) 代替。

textInput()

虽然可以删除actionButton()的组件,但是该方法不适用于使用selector = "div:has(> #txt)"删除类似的组件。我不确定为什么,因为在这种情况下jQuery选择器的逻辑似乎相同。

我还尝试将selector = "button:has(> #txt)"更改为button,以为jQuery搜索将适用于actionButton("txt", "This is no longer useful")元素,但同样无济于事。

编辑:找到了解决方案。用div()包装div<>会将操作按钮放入{{1}}块中,因此搜索将起作用。

1 个答案:

答案 0 :(得分:1)

  • 首先,一些常规内容,页面中的每个元素必须具有唯一的id,对于多个元素,您不能像对actionButtontextInput那样使用相同的名称。此规则适用于网络上的所有HTML页面。

  • 关于这个问题,我写了一个小函数,可以让您收集与特定模式匹配的元素


library(shiny)

ui <- fluidPage(
  sidebarPanel(
    actionButton("rmv", "Remove UI"),
    actionButton("txt", "This is no longer useful"),
    textInput("txt2", "This is no longer useful")
  )
)

# Server logic
server <- function(input, output, session) {

  getInputs <- function(pattern){
    reactives <- names(reactiveValuesToList(input))
    reactives[grep(pattern,reactives)]
  }

  observeEvent(input$rmv, {

    vals <- getInputs("txt")
    vals <- paste0("#",vals)

    removeUI(
      selector = vals,
      multiple = T
    )
  })
}
# Complete app with UI and server components
shinyApp(ui, server)

enter image description here