背景:我正在構建一個與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