Блестящая приборная панель с сюжетом - PullRequest
0 голосов
/ 19 декабря 2018

Я изучаю немного блеска, чтобы сделать приборную панель.У меня есть идея.Я хочу создать информационную панель, которая выбирает из выборки входную переменную, группирует ее по этой переменной и строит график или гистограмму общей суммы этой переменной.

Я сгенерировал примерный набор данных для создания того, что мне нужно, однакоЯ не могу получить то, что мне нужно.

Код 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 голосов
/ 19 декабря 2018

Проблема в том, что вы используете 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 использует нестандартную оценку по умолчанию.Вы можете прочитать больше об этом здесь .

Чтобы использовать стандартную (программируемую) оценку, вам нужно снять кавычки 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) возвращает City без кавычек.Таким образом, выражение оценивается как group_by(City) и, таким образом, будет работать, как и ожидалось.
...