R блестящее приложение с кнопкой перезапускает весь пользовательский интерфейс

#r #shiny

#r #блестящий

Вопрос:

Вот пример моего кода

 # I have a list of reactive elements
comparisons_list <-  reactiveValues(elements = list(), size = 0)

# I have a reactive conductor using that elements list
KPI_reactive_elements <- reactive({
  # maybe iterate through the input fields instead of 
  comparisons_list$elements %>%
    lapply(function (el) {
      KPIs %>%
        filter(ORDER_DATE >= input[[el$id]][1], ORDER_DATE <= input[[el$id]][2]) %>%
        arrange(ORDER_DATE) %>%
        mutate(group_name = el$name)
    }) %>%
    bind_rows()
})
 

У меня также есть пользовательский интерфейс с разными диапазонами дат, которые изменяются в соответствии с реактивным comparisons_list

 fluidPage(
  fluidRow(
    column(width=12, class="text-center",
    actionButton("addComparison", "Add Comparison", class="btn btn-primary"), br(),
    tags$ul(class="list-group unstyled list-unstyled",  br(), renderUI({
      tagList(
        comparisons_list$elements %>%
          lapply(function (el) tags$li(class="list-item",
            dateRangeInput(el$id,
                           el$name,
                           start  = el$start,
                           end    = el$end,
                           format = "mm/dd/yy",
                           separator = " - "),
            )))
      })
    ), renderUI({
        if(comparisons_list$size > 0) {
          div(
            selectInput("compare_field", "",
                        choices = COMPARE_FIELDS, selected = DEFAULT_COMPARE_FIELD),
            actionButton("clearComparisons", "Clear Comparisons", class="btn btn-warning")
          )
        } else {
          div()
        }
      })
    )))
 

У меня есть прослушиватель событий кнопки при добавлении новых сравнений

 observeEvent(input$addComparison, {
  comparisons_list$size <- comparisons_list$size   1
  comp_id <- paste0("comparison_", comparisons_list$size)
  print(comp_id)
  comparisons_list$elements[[comp_id]] <- list(
        start = Sys.Date() - 31,
        end   = Sys.Date() - 1,
        index = comparisons_list$size,
        name = paste0("Comparison ", comparisons_list$size),
        id = comp_id
  )
})
 

Наконец-то у меня есть линейная диаграмма HighCharter, показывающая мои данные

 renderHighchart({
  field <- gsub("_", " ", input$compare_field)
  comparisonTooltip <- paste(field, " is <b>{point.y}</b> on <b>{point.ORDER_DATE}</b>")

  if (comparisons_list$size > 0) {
    KPI_comparisons() %>%
      arrange(ORDER_DATE) %>%
      hchart(type="line", hcaes(y = !!input$compare_field, group=group_name)) %>%
      hc_tooltip(crosshairs = TRUE, borderWidth = 1.5,
                 headerFormat = "", pointFormat = comparisonTooltip) %>%
      hc_add_theme(hc_theme_monokai())
  }
})
 

Моя проблема в том, что при нажатии Add Comparison кнопки перезапускаются входные данные пользовательского интерфейса, а также диаграммы.

Это проблема с прослушивателем событий кнопки или это что-то еще?

Заранее спасибо!

Комментарии:

1. И пользовательский интерфейс, и средство визуализации диаграмм зависят от comparisons_list , который является reactiveValues . Слушатель input$addComparison изменяет comparisons_list , так что это, похоже, ожидаемое поведение.

2. @Limey Как я могу исправить эту проблему, чтобы у меня все еще были изменения в списке сравнений и в то же время не было этого повторного воспроизведения?

3. isolate Функция прерывает цепочку реактивности. Но если вы используете это, скажем, в функции пользовательского интерфейса, вам нужно будет найти другой способ обновить пользовательский интерфейс, чтобы отразить изменения comparisons_list . Предположительно, вы хотите это сделать, потому что вы сделали comparisons_list реактивный.