#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
реактивный.