簡體   English   中英

如何創建動態的observeEvent數量?

[英]How to create dynamic number of observeEvent in shiny?

在這里,我試圖復制我原來的問題。 如果您單擊“添加細分”,以下閃亮代碼將創建“子細分”按鈕。

現在,“添加子段”按鈕應在每次單擊時提供單行文本。 但是我注意到,它創建了(1 +多個'點擊后添加一個段'按鈕)多行。

對於單個observeEvent它正在工作(代碼被注釋掉)。

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列表中創建該按鈕,並且還會創建處理它的觀察者。 這樣,沒有重復項,應用程序按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM