【问题标题】:dynamic/conditional filtering in shiny select multiple inputs (selectizeInput, multiple = TRUE)闪亮选择多个输入中的动态/条件过滤(selectizeInput,multiple = TRUE)
【发布时间】:2020-02-05 01:47:04
【问题描述】:

在闪亮的输入 (selectizeInput) where multiple = TRUE 中进行动态/条件过滤的正确方法是什么?

在此示例中,我尝试显示受祖父过滤器限制的父过滤器(任何、全部、无),然后显示受父过滤器限制的子过滤器。

.getReactiveEnvironment()$currentContext 中的错误:如果没有活动的反应上下文,则不允许操作。 (你试图做一些只能在反应式表达式或观察者内部完成的事情。)

---
title: "Example"
runtime: shiny
output:
  flexdashboard::flex_dashboard:
  vertical_layout: fill
---


```{r}
library(tidyverse)
library(flexdashboard)
library(shinyWidgets)
```

```{r global, include=FALSE}
filter_df <- data.frame(filter_GP = c("gpA", "gpA", "gpA", "gpB", "gpB", "gpB"),
                        filter_P = c("p1", "p1", "p2", "p3", "p4", "p4"),
                        filter_C = c("g", "h", "i", "j", "k", "l"))

data_df <- data.frame(y = seq(from=1, to=12),
                      filter_C = c("g", "g", "h", "h", "i", "i", "j", "j", "k", "k", "l", "l"))

data_df <- 
data_df %>%
  left_join(filter_df, by="filter_C")
```


Sidebar {.sidebar}
=====================================

```{r}
# grandparents
  selectizeInput("GP", label = "Grandparents (multi-select):", 
                 choices = unique(filter_df$filter_GP), 
                 multiple = TRUE,
                 selected = "")

# parents
  selectizeInput("P", label = "Parents (multi-select):",
                 choices = unique(filter_df[filter_df$filter_GP %in% input$GP, "filter_P"]), 
                 multiple = TRUE,
                 selected = "")

# children
  selectizeInput("C", 'Children (multi-select):', 
                 choices = unique(filter_df[filter_df$filter_P %in% input$P, "filter_C"]), 
                 multiple = TRUE,
                 selected = "")
```



Test 
=====================================

更新

这是来自@heds1 的解决方案的 flexdashboard 版本:

---
title: "Example"
runtime: shiny
output:
  flexdashboard::flex_dashboard:
  vertical_layout: fill
---


```{r}
library(tidyverse)
library(flexdashboard)
library(shinyWidgets)
```

```{r global, include=FALSE}
filter_df <- data.frame(filter_GP = c("gpA", "gpA", "gpA", "gpB", "gpB", "gpB"),
                        filter_P = c("p1", "p1", "p2", "p3", "p4", "p4"),
                        filter_C = c("g", "h", "i", "j", "k", "l"))

data_df <- data.frame(y = seq(from=1, to=12),
                      filter_C = c("g", "g", "h", "h", "i", "i", "j", "j", "k", "k", "l", "l"))

data_df <- 
data_df %>%
  left_join(filter_df, by="filter_C")
```


Sidebar {.sidebar}
=====================================

```{r}
# grandparents
  selectizeInput("GP", label = "Grandparents (multi-select):", 
                 choices = unique(filter_df$filter_GP), 
                 multiple = TRUE,
                 selected = "")

# parents
  output$P <- renderUI({
        df <- data_df[data_df$filter_GP %in% input$GP, ]
        selectizeInput(
                    'P', 'Parents', choices = unique(df$filter_P), multiple = TRUE
                )
    })

  uiOutput("P")

# children
  output$C <- renderUI({
        df <- data_df[data_df$filter_GP %in% input$GP, ]
        df <- df[df$filter_P %in% input$P, ]
        selectizeInput(
                    'C', 'Children', choices = unique(df$filter_C), multiple = TRUE
                )
    })

  uiOutput("C")
```



Test 
=====================================

【问题讨论】:

    标签: r shiny flexdashboard shinywidgets


    【解决方案1】:

    您可以将uiOutputselectizeInput 结合使用。我不知道 flexdashboard 和 shinyWidgets,但是使用 shiny 本身,你可以这样做:

    library(shiny)
    library(tidyverse)
    
    filter_df <- data.frame(filter_GP = c("gpA", "gpA", "gpA", "gpB", "gpB", "gpB"),
                            filter_P = c("p1", "p1", "p2", "p3", "p4", "p4"),
                            filter_C = c("g", "h", "i", "j", "k", "l"))
    
    data_df <- data.frame(y = seq(from=1, to=12),
                          filter_C = c("g", "g", "h", "h", "i", "i", "j", "j", "k", "k", "l", "l"))
    
    data_df <- 
    data_df %>%
      left_join(filter_df, by="filter_C")
    
    ui <- {
        fluidPage(
            # grandparents
            selectizeInput("GP", label = "Grandparents (multi-select):", 
                                choices = unique(filter_df$filter_GP), 
                                multiple = TRUE,
                                selected = ""),
            uiOutput("P"),
            uiOutput("C")
        )
    }
    
    server <- function(input, output, session) {
    
        output$P <- renderUI({
            df <- data_df[data_df$filter_GP %in% input$GP, ]
            selectizeInput(
                        'P', 'Parents', choices = unique(df$filter_P), multiple = TRUE
                    )
        })
    
        output$C <- renderUI({
            df <- data_df[data_df$filter_GP %in% input$GP, ]
            df <- df[df$filter_P %in% input$P, ]
            selectizeInput(
                        'C', 'Children', choices = unique(df$filter_C), multiple = TRUE
                    )
        })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 太棒了,@heds1!我将您的解决方案的 flexdashboard 版本添加到我原来的问题中。
    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 2018-12-22
    • 2016-11-21
    • 2015-01-19
    • 2016-12-25
    • 2014-10-25
    • 1970-01-01
    相关资源
    最近更新 更多