如何在SHILINY中创建动态数量的观察事件? [英] How to create dynamic number of observeEvent in shiny?

查看:10
本文介绍了如何在SHILINY中创建动态数量的观察事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在这里,我试图复制我的原始问题。如果您单击"添加段",以下闪亮的代码将创建"子段"按钮。

现在,"添加子细分"按钮应该在每次单击时显示单行文本。但我注意到的是,它会创建(1+点击后的"添加段"按钮数量)很多行。

对于单个serveEvent,它正在工作(代码已被注释掉)。

library(shiny)

ui <- fluidPage(
  verbatimTextOutput("txt",placeholder = T), #"It is Created for Testing"
  actionButton("addSeg", "Add a Segment"),
  uiOutput("myUI")
)

server <- function(input, output, session) {
  alld <- reactiveValues()
  alld$ui <- list()

  # Action to add new Segment
  observeEvent(input$addSeg,{
    alld$ui[[length(alld$ui)+1]] <- list(actionButton(paste0("addSub_",(length(alld$ui)+1)), "Add a Sub Segment"))
  })

  # Action to add new Sub Segment
  # observeEvent(input[[paste0("addSub_",1)]],{
  #   alld$ui[[1]][[length(alld$ui[[1]])+1]] <- paste0("addSub_",1)
  # })

  observeEvent(input$addSeg,{
    lapply(1:length(alld$ui), function(i){
      observeEvent(input[[paste0("addSub_",i)]],{
        alld$ui[[i]][[length(alld$ui[[i]])+1]] <- HTML(paste0("<br>addSub_",i,"<br>"))
      })
    })
  })

  output$myUI <- renderUI({alld$ui})

  output$txt <- renderText(class(alld$ui))
}

shinyApp(ui, server)

请帮助.

推荐答案

非常有趣的问题,也是非常值得推荐的代表。我设法找到了一个解决方案。您可以用以下内容替换您的服务器对象:

server <- function(input, output, session) {
  alld <- reactiveValues()
  alld$ui <- list()

  # Action to add new Segment
  observeEvent(input$addSeg,{
    new_id <- length(alld$ui) + 1
    sub_name <- paste0("addSub_", new_id)

    alld$ui[[new_id]] <- list(
      actionButton(sub_name, "Add a Sub Segment")
    )

    observeEvent(input[[sub_name]], {
      new_text_id <- length(alld$ui[[new_id]]) + 1
      alld$ui[[new_id]][[new_text_id]] <- HTML(paste0("<br>addSub<br>"))
    })
  })

  output$myUI <- renderUI({alld$ui})

  output$txt <- renderText({
    capture.output(str(alld$ui))
  })
}

让我们讨论一下您的原始代码。您的第一个观察器工作正常。然而,第二个原因导致了不受欢迎的行为。它返回一个新观察者列表,当前应用程序中的每个addSub按钮对应一个观察者列表。这意味着在第一次单击时,它将创建addSub_1的观察者,在第二次单击时,它将返回addSub_1addSub_2的观察者。但是,第一个addSub_1观察者仍然存在。这意味着当您单击addSub_1时,会有两个观察者响应,文本会显示两次。

我的解决方案是将您的两个观察者合并为一个。当您单击addSeg时,按钮将在UI列表中创建,并且处理它的观察者也会创建。这样,就不会有重复项,应用程序也会按预期工作。

这篇关于如何在SHILINY中创建动态数量的观察事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆