在闪亮的应用程序中选择多个输入时,为什么错误取决于选择输入的顺序?

时间:2017-05-26 18:08:42

标签: r shiny flexdashboard

我有一个带有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

这个错误在静态图表的上下文中对我有意义,但我很困惑为什么选择名称的顺序应该重要以及如何解决它。

1 个答案:

答案 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 `==`