我希望能够删除一个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)
答案 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中。