如何在矢量应用程序中使用矢量工作dplyr :: filter

时间:2017-05-19 05:02:38

标签: r dplyr shiny

我有以下Rmarkdown:

---
title: "Untitled"
runtime: shiny
output: 
  flexdashboard::flex_dashboard:
    theme: bootstrap 
    orientation: columns
    vertical_layout: scroll
---

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

Column {data-width=650}
-----------------------------------------------------------------------

```{r}

sidebarPanel( textInput("flowers", "flower name(s)", "virginica, setosa") )
mainPanel(
  renderPrint({
   flower_list <- unlist(lapply(strsplit(input$flowers, ",")[[1]], tolower))
   dat <- iris %>% filter(Species %in% flower_list)
   unique(dat$Species)
  })



)

```

基本上它的作用是从用户输入和返回列表 过滤后的名称。但似乎它不起作用:

enter image description here

例如,主面板应返回两个值virginia setosa。 什么是正确的方法?

在控制台中它可以正常工作:


library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
dat <- iris %>% 
  filter(Species %in% c("virginica","setosa"))
unique(dat$Species)
#> [1] setosa    virginica
#> Levels: setosa versicolor virginica

2 个答案:

答案 0 :(得分:1)

这是因为virginiasetosasidebarPanel( textInput("flowers", "flower name(s)", "virginica, setosa") )之间的空格。您可以通过修改代码来删除空格或删除空格:

flower_list <- trimws(unlist(lapply(strsplit(input$flowers, ",")[[1]], tolower)))

答案 1 :(得分:1)

由于只有一个字符串,在拆分后我们得到list length 1.可以通过提取第一个元素(vector将其转换为[[1]] })

flower_list <- tolower(strsplit(input$flowers, ",\\s*")[[1]])

此外,我们还使用正则表达式更改了split模式,以便在逗号(\\s*)之后匹配零个或多个空格(,

通过此更改,仪表板看起来像

enter image description here

可以使输出显示的顺序与textInput

中的顺序相同
 mainPanel(
   renderPrint({
    flower_list <- strsplit(input$flowers, ",\\s*")[[1]]
    iris %>% 
      filter(Species %in% flower_list) %>%
      mutate(Species = factor(Species, levels = flower_list)) %>%
      .$Species %>%
      levels
   })
 )

enter image description here

在OP的帖子中,正如提到的另一个答案,我们为' setosa'获得了一个领先的空间,当我们在filter中进行完全匹配时,它将无法匹配。仅当输入字符串可以包含大写字母时才需要tolower。在示例中,情况并非如此,因此可以省略。