带有情节的闪亮仪表板

时间:2018-12-19 17:02:33

标签: shiny shinydashboard

我正在学习一些闪亮的东西来做一个仪表板。我有个主意。我想创建一个仪表板,从selectinput中选择一个变量,按该变量分组,然后绘制该变量总数的条形图或直方图。

我已经生成了一个样本数据集来生成所需的内容,但是我找不到所需的内容。

UI代码是下一个:

library(shiny)

shinyUI(fluidPage(
    titlePanel("Demo dashboard"),

  sidebarLayout(
    sidebarPanel(
       selectInput("variable",
                   "group by",
                   choices = c("City","Country")
                    )
    ),

    mainPanel(
       plotOutput("distPlot")
    )
  )
))

服务器代码是下一个,在这里,我根据输入的变量进行汇总并绘制总计

library(shiny)
library(dplyr)


shinyServer(function(input, output) {

  output$distPlot <- renderPlot({

    sample<-tbl_df(data.frame(c("City1","City2","City3","City1","City2","City3","City2","City3"),
                              c("A","B","C","D","D","A","A","B"),
                              c(12,14,15,12,12,14,8,10)))
    colnames(sample)<-c("City","Country","Amount")
    df1<-sample%>%group_by(input$variable)%>%
    summarise(total=sum(Amount))
    sample%>%group_by(input$variable)%>%summarise(total=sum(Amount))

    x<- df1$total 
    hist(x)
  })

})

下一个是我的结果的屏幕截图:

enter image description here

但是,这不是预期的结果。我无法获得所需的直方图

1 个答案:

答案 0 :(得分:0)

问题是您使用dplyr

您的原始代码不会将input$variable评估为按城市分组,而是尝试按不存在的称为“ input $ variable”列的分组:

sample %>%
      group_by(input$variable) %>%
      summarise(total=sum(Amount))

结果:

# # A tibble: 1 x 2
# `input$variable` total
# <chr>            <dbl>
#   1 City                97

您可以通过在语句之后添加打印语句(例如:print(df1))或在语句之前添加browser()来轻松地进行检查。

此行为是因为dplyr默认使用非标准评估。您可以阅读有关here的更多信息。

要使用标准(可编程)评估,您需要取消引用 input$variable,以便将该值传递给dplyr。在当前版本中,您可以结合使用!!sym来做到这一点。

示例:

sample %>%
    group_by(!!sym(input$variable)) %>%
    summarise(total=sum(Amount))

结果:

# # A tibble: 3 x 2
# City  total
# <fct> <dbl>
# 1 City1    24
# 2 City2    34
# 3 City3    39

直方图: result

编辑:更多解释:group_by 不评估其输入,但引用它:这就是为什么您得到`input $ variable` 作为列名。

另一方面:sym函数将input$variable的实际值转换为符号,然后可以使用!!删除引号:

在dplyr中有效的是,如果您在输入中没有引号,那么:group_by(City)

让我们一步一步来看看:

  1. sym(input$variable)返回“城市”。 group_by("City")仍然无法正常工作,因为输入内容用引号引起了!
  2. 这就是我们需要使用!!的原因:!! sym(input$variable)返回不带引号的城市。因此该表达式的值为group_by(City),因此将按预期工作。