r - 使 renderUI 成为observeEvent的输入

标签 r shiny shiny-reactivity

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

在下面的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)

最佳答案

这应该可以解决问题:

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 例程分为两部分:第一部分仅应用宽度过滤器,第二部分还包含物种过滤器。您可以通过在 renderUI 函数中使用的名称来访问动态创建的复选框。我们必须拆分响应式(Reactive)过滤器的原因是,否则 renderUI 将依赖于我们想要避免的复选框本身。

更新

我刚刚读到您只是想返回复选框的值而不是使用它来过滤。但我想现在应该很清楚了,只要在需要的地方使用 input$occurrence_checkboxes 即可。

关于r - 使 renderUI 成为observeEvent的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57410899/

相关文章:

r - Shiny :更新输入而不触发 react ?

r - 根文件夹的 Shiny 路径?

r - 我可以以编程方式控制 plotly 缩放功能,而不必在 R shiny 应用程序中重新绘制吗?

r - 如果没有可用的 UI 输入,则防止在 Shiny 中发生事件

r - 为什么汇总和汇总给出的答案顺序不同?

python - R 选取经济衰退期的开始日期和结束日期

r - 使用Biostrings编写R程序将核苷酸序列转换为蛋白质序列

r - 无法以我喜欢的方式在 R markdown 中显示数学方程式

css - Shiny :标签位置,文本输入

javascript - Shiny 的 R : Change border color of selectInput