我有以下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)
})
)
```
基本上它的作用是从用户输入和返回列表 过滤后的名称。但似乎它不起作用:
例如,主面板应返回两个值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
答案 0 :(得分:1)
这是因为virginia
中setosa
和sidebarPanel( 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*
)之后匹配零个或多个空格(,
)
通过此更改,仪表板看起来像
可以使输出显示的顺序与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
})
)
在OP的帖子中,正如提到的另一个答案,我们为' setosa'
获得了一个领先的空间,当我们在filter
中进行完全匹配时,它将无法匹配。仅当输入字符串可以包含大写字母时才需要tolower
。在示例中,情况并非如此,因此可以省略。