问题描述
我有一个闪亮的应用程序,其中包含多个动态/条件输入(下一个输入基于我在上一个选择中的选择)。为此,我使用renderUI
。
output$input1_server <- renderUI({
validate(need(base(),"Error"))
df <- base %>%
filter(age >= 10) %>%
select(city)
selectInput(session$ns("input1"),"Input #1:",choices = df$city,width = "100%")
})
我还有reactive
,它使用 inputs 作为过滤参数,例如:
data <- reactive({
base %>%
#some filters %>%
#some manipulations %>%
#etc
})
然后我使用reactive
data()来建立反应性绘图
plot <- reactive({
data() %>%
ggplot( ... ) %>%
geom_bar( ... ) %>%
#etc...
})
# Rendering
output$plot_output <- renderPlot({ plot() })
当我更改动态输入时会发生问题,这会导致其他动态输入的更改。然后发生renderPlot()
中的错误,尽管有错误,但会在几秒钟内显示出图。我确信由于大量的renderUI会发生错误。我尝试使用sys.sleep
来给函数执行更多时间,但是它不起作用。该代码是正确的,因为当我在闪亮的应用程序中使用它时,它就可以工作。
解决方法
在没有最少可重复的示例的情况下,我会给我最好的猜测。
您可以使用req
来确保data()
和plot()
可用:
plot <- reactive({
req(data())
data() %>%
ggplot( ... ) %>%
geom_bar( ... ) %>%
#etc...
})
# Rendering
output$plot_output <- renderPlot({
req(plot)
plot() })
另一个选项是validate
:
plot <- reactive({
validate(need(nrow(data())>0,"Data not yet calculated"))
data() %>%
ggplot( ... ) %>%
geom_bar( ... ) %>%
#etc...
})
我希望这会有所帮助,但是在没有MRE的情况下很难告诉更多信息。