Фильтрация нескольких столбцов по значению с помощью группы флажков - PullRequest
0 голосов
/ 07 ноября 2018

Как я могу использовать группу флажков для фильтрации нескольких столбцов по значению? См. Пример ниже: я хочу вернуть только те строки, для которых столбцы, указанные в группе флажков, имеют значение «да».

---
title: "test"
runtime: shiny
output: 
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
---

```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
```

```{r}
checkboxGroupInput("checkGroup", label = h3("Checkbox group"), 
choices = list("col1", "col2"))
```

```{r}
df <- data.frame(c(1,2,3),c("no","yes","yes"),c("no","no","yes"))
colnames(df)<-c("id","col1","col2")
```
```{r}
renderDataTable({
    df        
})
```

т.е. при выборе «col1» вывод должен содержать только строки строк № 2 и 3, при выборе «col2» вывод должен быть: строка № 3, при выборе «col1» и «col2» выходные данные должны быть: строки № 2 и 3.

Я мог бы написать оператор if для каждой переменной, но я бы не хотел (у меня есть 10 или около того). Конечно, должен быть лучший способ?

1 Ответ

0 голосов
/ 07 ноября 2018

Здесь вам нужно разработать условие фильтра для ваших данных на основе входных значений. Я собираюсь использовать dplyr любую функцию filter_at, чтобы показать вам, как.

Это также включает в себя некоторые реактивные концепции, используемые в блестящей. Если вы не слишком знакомы с ними, я бы порекомендовал немного почитать.

---
title: "test"
runtime: shiny
output: 
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
---

```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
library(dplyr)
```

```{r}
checkboxGroupInput("checkGroup", label = h3("Checkbox group"), 
choices = list("col1", "col2"))
```

```{r}
df <- data.frame("id" = c(1,2,3), "col1" = c("no","yes","yes"),"col2" = c("no","no","yes"))
```
```{r}
renderDataTable({
    filter_at(df, input$checkGroup, any_vars(. == "yes"))       
})
```

В последнем фрагменте кода вы будете использовать filter_at, и, поскольку вы делаете это на основе входных данных, оно должно находиться в пределах renderDataTable реактивной функции.

Что это делает:

  1. Отфильтруйте df
  2. в переменных, выбранных вами из input$checkGroup (ваш флажок)
  3. выбор любых переменных из указанного выбора, которые эквивалентны "да". (Например, any_vars(. == "yes)). Точка является заполнителем для переменных, указанных в выбранных вами входных данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...