R Shiny InsertUI进入fluidRow

时间:2017-05-05 16:57:44

标签: r shiny

我希望能够删除一个UI元素,它是包含在fluidRow中的textInput,并将该元素(fluidRow和textInput)重新插入UI。但是,到目前为止,我没有取得任何成功。

removeUI按钮删除了所有fluidRows,包括找到按钮的那些。如果我尝试将它们放在一个单独的HTML分区中,它似乎没什么区别。或者,如果它有效,则textInput不再位于偏移流体行中。这是我的第一个闪亮的问题,所以请保持温和,我可能会犯一些明显的错误。

  # Define UI
  ui <- fluidPage(
          fluidRow(column(2,actionButton("rmv", "Remove UI"))),
          fluidRow(column(2,actionButton("add", "Add UI"))),
          tags$div(id='aTextBox', fluidRow(column(2,offset=6,
                                                  textInput("txt", "This is no longer useful"))
                                            )
                                   )
)


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

   observeEvent(input$rmv, {
       removeUI(
         selector = "div:has(> #aTextBox)"
      )
    })

   observeEvent(input$add, {
    insertUI(
      selector = "#add",
       where = "afterEnd",
       ui = tags$div(id='aTextBox', fluidRow(column(2,offset=6,
                                               textInput("txt", "This is no longer useful"))
                                        )
                                )
     )
   })
 }

   # Complete app with UI and server components
  shinyApp(ui, server)

2 个答案:

答案 0 :(得分:3)

主要问题是removeUI太宽泛了。在这种情况下,您想要的是直接removeUI('#aTextBox')

但是,此代码存在一些问题,即使它正常工作也是如此。这些主要与它允许用户点击&#34;添加&#34;多次,但这将始终添加完全相同的元素,具有相同的ID,这是无效的HTML。大多数浏览器一开始都不会抱怨它,但它会回来咬你。要解决此问题,您可以在每次用户点击&#34;添加&#34;时更改ID,以便不会出现重复。或者,您可以跟踪该元素是否已插入(但尚未删除)。您可以使用简单的无功值来完成此操作。这似乎是你所追求的行为,所以我在下面做了一个模拟(这个代码运行正常,但它可能会受益于一些重构和变量重命名),还有一些更多的铃声和口哨声(当你点击时会弹出通知&#34;添加&#34;或&#34;删除&#34;当你不应该):

dynamicUI <- function(n) {
  if (n != 0) {
    showNotification("That input already exists",
      type = "warning"
    )
    return()
  } else {
    fluidRow(id = 'aTextBox', 
      column(2, offset = 6,
        textInput("txt", "This is no longer useful")
      )
    )
  }
}

# Define UI
ui <- fluidPage(
  fluidRow(column(2, actionButton("rmv", "Remove UI"))),
  fluidRow(column(2, actionButton("add", "Add UI"))),
  div(id = "placeholder"),
  dynamicUI(0)
)

# Server logic
server <- function(input, output) {
  n <- reactiveVal(1)

  observeEvent(input$rmv, {
    if (n() != 1) {
      showNotification("Nothing to remove",
        type = "error"
      )
      return()
    }
    removeUI(selector = "#aTextBox")
    n(0)
  })

  observeEvent(input$add, {
    insertUI(
      selector = "#placeholder",
      where = "afterEnd",
      ui = dynamicUI(n())
    )
    n(1)
  })
}

# Complete app with UI and server components
shinyApp(ui, server)

答案 1 :(得分:1)

用两个地方替换div:

  tags$div(fluidRow(id='aTextBox', column(2,offset=6,
                                          textInput("txt", "This is no longer useful"))

修改 正如Barbara div(id = "placeholder")所指出的那样,可以使用文本框不与actionButton()放在同一个div中。