背景:我正在构建一个与MySQL数据库接口的仪表板。用户指定粗糙过滤器从数据库中提取数据并点击“提交”,数据用ggvis
绘制,然后用户能够使用精细过滤器进行播放以影响绘制哪些数据子集。这些精细的过滤器取决于从数据库中提取的数据,因此我使用uiOutput
/renderUI
从数据生成它们。ggvis在R之前更新UI Shiny
问题:我的挑战就是我想要的UI基于数据剧情更新之前更新。否则,旧数据集中的精细过滤器将应用于新数据,这会在绘图时导致错误。
示例:以下示例使用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)
类似于这个问题,这是没有答案:http://stackoverflow.com/questions/24010346/priority-value-in-reactive-like-in-observe-r-shiny –
它有帮助,你可以设置延迟使用' shinyjs ::延迟()' – Dambo