将renderUI设为observeEvent的输入

时间:2019-08-08 10:51:39

标签: r shiny shiny-reactivity

正如标题所示,我希望制作一个动态创建的UI对象(使用renderUI),以后可以在Shiny App中对其进行进一步的操作。

在下面的reprex中,我有一个玩具应用程序,该应用程序允许用户根据萼片宽度过滤iris数据集。根据用户选择的范围,然后生成一个在该萼片宽度范围内的所有唯一物种的复选框列表。

我的问题:用户过滤表格后,如何使应用程序告诉我已选择了哪个物种的复选框?例如,在默认应用程序设置中,当萼片宽度范围在1到2之间时,只有一种会满足过滤器要求(通用颜色)。当用户选中Versicolor框时,我希望该应用程序更新以告诉我已选择Versicolor。

类似地,当萼片宽度范围更大时(然后在动态生成的复选框列表中包含更多种类),我希望UI再次更新以告诉我选择了哪种种类(1、2或全部3个种类) )。

我脑海中的基本工作流程是:

(1)用户筛选器数据集(2)基于筛选器显示的表更新(3)应用程序生成唯一物种的复选框列表(4)用户单击物种,物种名称显示在屏幕上。

library(shiny)
library(DT)
library(dplyr)

ui <- basicPage(

  fluidRow(
    uiOutput("ui"),
    sliderInput("slider", "Sepal Width", min = 0, max=20, value=c(1:2)),
    tableOutput("data")

  ),

)



server <- function(input, output){

  data("iris")

  filtered<-reactive({

    iris %>% filter(`Sepal.Width` %in% input$slider[1]:input$slider[2])


  })

  output$data<-renderTable({

    filtered()

  })

  output$ui<-renderUI({

    species<-filtered() 
    checkboxGroupInput(inputId = 'occurence_checkboxes', label = 'Species', choices = unique(species$Species))

  })




}

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

library(shiny)
library(dplyr)

ui <- basicPage(
  fluidRow(
    uiOutput("ui"),
    sliderInput("slider", "Sepal Width", min = 0, max=20, value = 1:2),
    tableOutput("data")
  )
)

server <- function(input, output){
  get_width_filter <- reactive({
     iris %>% filter(between(Sepal.Width, input$slider[1], input$slider[2]))
  })

  get_ovl_filter <- reactive({
     get_width_filter() %>%
       filter(Species %in% input$occurence_checkboxes)
  })

  output$data <- renderTable({
    get_ovl_filter()
  })

  output$ui <- renderUI({
    choices <-  get_width_filter() %>% pull(Species) %>% unique()
    checkboxGroupInput("occurence_checkboxes", 
                       "Species", 
                       choices = choices, 
                       selected = choices)
  })
}

shinyApp(ui, server)

说明

我们需要将filtered例程分为两部分:1仅应用宽度过滤器,另一部分还包含种类过滤器。您可以通过在renderUI函数中使用的名称访问动态创建的复选框。我们必须拆分过滤器反应性的原因是,否则renderUI将依赖于我们要避免的复选框本身。

更新

我刚刚读到您只想返回复选框的值,而不用它进行过滤。但是我想这应该现在就清楚了,只要在需要的地方使用input$occurence_checkboxes