使用Shiny创建反应式selectInput - flexdashboard

时间:2017-08-31 07:44:18

标签: r shiny r-markdown flexdashboard

我试图在flexdashboard文档中使用Shiny进行反应性selectInput。

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

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

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

    reactive({
    selectInput("Reef", label = "Priority Reef:",
            choices = zone.choices()$ReefName, selected = "Arlington Reef (16-064)")
    })
    
  4. 当我运行文档时,我的第二个输入显示了一堆代码而不是选择菜单,因此基于该选择器的所有进程都失败了。

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

    ---
    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")
    })
    ```
    

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

    干杯,

    萨姆

1 个答案:

答案 0 :(得分:3)

以下是您的解决方案:

---
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")})

```

问题在于您的selectInput("Reef"...),您已将其设置为被动(其为inccorect) - > 您应该将其设置为UI对象({{1} })。