Как создать динамический номер наблюдаемого события в блестящем? - PullRequest
0 голосов
/ 17 января 2019

Здесь я попытался повторить мою первоначальную проблему. Следующий блестящий код создаст кнопку «Подсегмент», если вы нажмете «Добавить сегмент».

Теперь кнопка «Добавить подсегмент» должна отображать текст в одну строку при каждом клике. Но то, что я заметил, создает (1 + количество кнопки «Добавить сегмент» после нажатой) много строк.

Для единственного наблюдателя событие работает (код закомментирован).

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)

Пожалуйста, помогите ...

enter image description here

1 Ответ

0 голосов
/ 17 января 2019

Очень интересный вопрос и очень похвальный репекс. Мне удалось найти решение. Вы можете заменить свой объект сервера следующим образом:

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_1 и addSub_2. Тем не менее, первый addSub_1 наблюдатель все еще существует. Это означает, что при нажатии addSub_1 отвечают два наблюдателя, и текст отображается дважды.

Мое решение - объединить двух ваших наблюдателей в одного. Когда вы нажимаете addSeg, кнопка создается в списке UI, и также создается наблюдатель, который ее обрабатывает. Таким образом, нет дубликатов, и приложение работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...