Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 删除动态添加到闪亮UI的每个元素上的按钮_R_Shiny - Fatal编程技术网

R 删除动态添加到闪亮UI的每个元素上的按钮

R 删除动态添加到闪亮UI的每个元素上的按钮,r,shiny,R,Shiny,我正在尝试创建一个闪亮的应用程序,它有一个动态UI,可以添加任意数量的输入字段,每次单击一个操作按钮都会添加一个。一旦创建了这些新的输入,就应该通过单击与输入一起添加的另一个操作按钮来移除,而不是像这个问题中那样,例如从列表中选择要移除的元素 我在Shinny的动态UI文章中使用了两个示例:特别是:我不喜欢第一个示例要求您选择要删除的UI元素,然后单击以删除它的方式。我希望通过在每个新元素中添加一个删除按钮来完成这一点 基于这个堆栈溢出问题,我编写了下面的代码,以生成一个响应函数,该函数将侦听多

我正在尝试创建一个闪亮的应用程序,它有一个动态UI,可以添加任意数量的输入字段,每次单击一个操作按钮都会添加一个。一旦创建了这些新的输入,就应该通过单击与输入一起添加的另一个操作按钮来移除,而不是像这个问题中那样,例如从列表中选择要移除的元素

我在Shinny的动态UI文章中使用了两个示例:特别是:我不喜欢第一个示例要求您选择要删除的UI元素,然后单击以删除它的方式。我希望通过在每个新元素中添加一个删除按钮来完成这一点

基于这个堆栈溢出问题,我编写了下面的代码,以生成一个响应函数,该函数将侦听多个输入:,显然,您无法分割输入对象:,我也不知道如何让我的响应函数确定单击了哪个移除按钮,因此我认为这种方法是一条死胡同。我对闪亮和反应式编程还不熟悉,所以我不太了解所有的特性,我希望能得到一些建议,我可以用它们来实现这个结果

library(shiny)

ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(

            actionButton('addBtn', 'Add input Set'),

            tags$div(id='inputList')
        ),
        mainPanel()
    )
)

server <- function(input, output) {

    observeEvent(input$addBtn, {
        n <- input$addBtn
        id <- paste0("input",n)
        insertUI(
            selector = '#inputList',
            ui=div(
                selectizeInput(
                    inputId = id,
                    choices = c("Stuff","to","input"),
                    selected = c("Stuff"),
                    label = "An Input:",
                    multiple = TRUE
                ),
                actionButton(paste0('removeBtn',n), 'Remove')
            )
        )
    })

    # removeModelReact <- reactive({input[grepl(pattern = "removeBtn",names(input))]},{
    #   # which button changed... and return that
    # })
    # 
    # eventReactive(removeModelReact(),{
    #   removeUI(
    #       selector = paste0('div:has(> #input',removeModelReact(),')')
    #   )
    # })
}

shinyApp(ui, server)
库(闪亮)
ui嗨,这应该可以

server <- function(input, output) {

  observeEvent(input$addBtn, {
    nr <- input$addBtn
    id <- paste0("input",input$addBtn)
    insertUI(
      selector = '#inputList',
      ui=div(
        id = paste0("newInput",nr),
        selectizeInput(
          inputId = id,
          choices = c("Stuff","to","input"),
          selected = c("Stuff"),
          label = "An Input:",
          multiple = TRUE
        ),
        actionButton(paste0('removeBtn',nr), 'Remove')
      )
    )
    observeEvent(input[[paste0('removeBtn',nr)]],{
      shiny::removeUI(
        selector = paste0("#newInput",nr)
      )
    })
  })

服务器谢谢@beril barton我不会想到将第二个
observeEvent()
放在第一个内部,这样就不需要在第一个观察者的范围之外跟踪按钮标识符。我不知道你能做出这样的反应。