使用 Shiny 创建响应式 selectInput - flexdashboard

Sam*_*ews 2 r r-markdown shiny flexdashboard

我正在尝试在 Flexdashboard 文档中使用 Shiny 制作反应式 selectInput。

  1. 我的第一个selectInput选择是海洋公园的区域类型。

    selectInput("Zone", label = "Marine Park Zoning:",
              choices = c("All", levels(EoTR$MarineParkZone)), selected = "All")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后,我使用此输入创建一个反应式数据框,其中仅包含步骤 1 中选择的区域。

    zone.choices = reactive({
      if (input$Zone=="All"){
      select(EoTR, ReefName, MarineParkZone, MarineParkMgmtSection)
      }else{
      select(EoTR, ReefName, MarineParkZone, MarineParkMgmtSection)%>%
      filter(MarineParkZone==input$Zone)}
    })
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后我尝试使用这个反应式数据框来定义我的下一个选择selectInput

    reactive({
    selectInput("Reef", label = "Priority Reef:",
            choices = zone.choices()$ReefName, selected = "Arlington Reef (16-064)")
    })
    
    Run Code Online (Sandbox Code Playgroud)

当我运行该文档时,我的第二个输入显示一堆代码而不是选择菜单,因此基于该选择器的所有进程都会失败。

下面是一些可以重现该问题的代码

---
title: "Untitled"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
runtime: shiny 
---
```{r}
library(flexdashboard)
library(dplyr)

EoTR = data.frame(ReefName=c("Reef1", "Reef2", "Reef3", "Reef4"), 
              MarineParkZone=c("Fished", "Fished", "Un-Fished", "Un-Fished"))

selectInput("Zone", label = "Marine Park Zoning:",
          choices = c("All", levels(EoTR$MarineParkZone)), selected = "All")

zone.choices = reactive({
  if (input$Zone=="All"){
  select(EoTR, ReefName, MarineParkZone)
  }else{
  select(EoTR, ReefName, MarineParkZone)%>%
  filter(MarineParkZone==input$Zone)}
})

reactive({
selectInput("Reef", label = "Priority Reef:",
        choices = zone.choices()$ReefName, selected = "Reef1")
})
```
Run Code Online (Sandbox Code Playgroud)

我知道我定义反应性输入的方式可能有些愚蠢,但我真的很感激对此的任何帮助。

干杯,

山姆

Mal*_*l_a 5

这是为您提供的解决方案:

---
title: "Untitled"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
runtime: shiny 
---
```{r}
library(flexdashboard)
library(dplyr)

EoTR = data.frame(ReefName=c("Reef1", "Reef2", "Reef3", "Reef4"), 
              MarineParkZone=c("Fished", "Fished", "Un-Fished", "Un-Fished"))

selectInput("Zone", label = "Marine Park Zoning:",
          choices = c("All", levels(EoTR$MarineParkZone)), selected = "All")

zone.choices = reactive({
  if (input$Zone=="All"){
  EoTR
  }else{
  EoTR %>%
  filter(MarineParkZone==input$Zone)}
})


renderUI({selectInput("Reef", label = "Priority Reef:",
        choices = zone.choices()$ReefName, selected = "Reef1")})

```
Run Code Online (Sandbox Code Playgroud)

问题在于您的selectInput("Reef"...),您已将其设置为响应式(这是不正确的)-->您应该将其呈现为 UI 对象(renderUI)。