Предыстория: я создаю панель мониторинга, которая взаимодействует с базой данных MySQL. Пользователь указывает грубый фильтр для извлечения данных из базы данных и нажимает «Отправить», данные отображаются с помощью ggvis
, затем пользователь может играть с тонкими фильтрами, чтобы повлиять на то, какое подмножество данных отображается. Эти тонкие фильтры зависят от данных, извлеченных из базы данных, поэтому я генерирую их из данных, используя uiOutput
/renderUI
.
Проблема: я хочу, чтобы пользовательский интерфейс обновлялся на основе данных до обновления графика. В противном случае к новым данным применяются тонкие фильтры из старого набора данных, что приводит к ошибке при построении графика.
Пример. Следующий пример примерно воспроизводит проблему с использованием mtcars
. Чтобы получить ошибку, выберите 4 цилиндра, нажмите «Отправить», затем выберите 6 цилиндров и снова нажмите «Отправить». В этом случае, когда фильтр тонкой очистки с 4 цилиндрами применяется к набору данных с 6 цилиндрами, возвращается только одна точка, что вызывает ошибку при попытке применить сглаживание в ggvis
. Не та же ошибка, что и у меня, но достаточно близко.
library(shiny)
library(dplyr)
library(ggvis)
ui <- fluidPage(
headerPanel("Example"),
sidebarPanel(
h2("Course Filter:"),
selectInput("cyl_input", "Cylinders", c(4, 6)),
actionButton("submit", "Submit"),
conditionalPanel(condition = "input.submit > 0",
h2("Fine Filter: "),
uiOutput("mpg_input")
)
),
mainPanel(
ggvisOutput("mtcars_plot")
)
)
server <- function(input, output) {
mycars <- eventReactive(input$submit, {
filter(mtcars, cyl == input$cyl_input)
})
output$mpg_input <- renderUI({
mpg_range <- range(mycars()$mpg)
sliderInput("mpg_input", "MPG: ",
min = mpg_range[1], max = mpg_range[2],
value = mpg_range,
step = 0.1)
})
observe({
if (!is.null(input$mpg_input)) {
mycars() %>%
filter(mpg >= input$mpg_input[1],
mpg <= input$mpg_input[2]) %>%
ggvis(~mpg, ~wt) %>%
layer_points() %>%
layer_smooths() %>%
bind_shiny("mtcars_plot")
}
})
}
shinyApp(ui = ui, server = server)
shinyjs::delay()
- person Dambo   schedule 02.08.2016