我有一个带有runtime: shiny
的flexdashboard文档(我在这里发布了应用https://arie.shinyapps.io/reproducible_example/并嵌入了代码,但是想要将代码放在下面,以防应用超出其分配的用量在shinyapps.io ):
---
title: "Example"
runtime: shiny
output:
flexdashboard::flex_dashboard:
source_code: embed
---
给出以下示例数据集:
```{r setup, include=FALSE}
library(flexdashboard)
library(tidyverse)
df <- tibble(name = c("peter", "paul", "mary"),
value = c(1:3))
```
我希望能够从以下用户界面中进行多项选择:
Column {data-width=250, .sidebar}
-----------------------------------------------------------------------
```{r}
# creates interface
selectInput("name_input", label = "Name", choices = df$name,
selected = NULL, multiple = TRUE, selectize = TRUE)
```
并且有一个ggplot&#34;反应&#34;选择。所以我制作了一个反应数据集:
```{r}
# reactive data
df_reactive <- reactive(df[df$name == input$name_input,])
```
并创建以下图:
Column {data-width=750}
-----------------------------------------------------------------------
### Chart B
```{r}
renderPlot(
ggplot(df_reactive(), aes(x = input$name_input, y = value) ) +
geom_col()
)
```
现在,当我Run Document
并选择第一个peter
,然后选择paul
,然后选择mary
时,情节会完全按照预期做出反应:每次增加一个条形名称已添加。例如,当我首先选择paul
然后选择peter
时会出现问题,这会引发错误Aesthetics must be either length 1 or the same as the data (2): x, y
。
这个错误在静态图表的上下文中对我有意义,但我很困惑为什么选择名称的顺序应该重要以及如何解决它。
答案 0 :(得分:1)
问题在于:
df_reactive <- reactive(df[df$name == input$name_input,])
如果length(input$name_input)
是&lt; 3您将尝试比较两个不同长度的数组。 R将抛出错误,它也不是您实际想要执行的测试。
正如我所看到的,如果df$name
中包含每个元素,您希望对其中的每个元素进行测试。幸运的是,在R中有一个快捷方式,所以你不必使用for循环或input$name_input
,...
就像我在评论中写的那样:sapply()
也可以。
关于符号的更多细节,我会参考现有的答案,因为答案会变得更复杂。
这里解释了df_reactive <- reactive(df[df$name %in% input$name_input,])
和==
之间的区别:
difference between `%in%` VS `==`