在react下使用多个RenderUI

问题描述

我有一个闪亮的应用程序,其中包含多个动态/条件输入(下一个输入基于我在上一个选择中的选择)。为此,我使用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的情况下很难告诉更多信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...