R Shiny Reactive dplyr фильтрует для формирования нового информационного кадра для построения графика - PullRequest
0 голосов
/ 30 апреля 2018

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

Мой пользовательский интерфейс:

choices <- c("Web" = 1,"Huddle" = 3, "Other" = 5, "Test" = 7)
role <- c("Student" = 1, "Not" = 2)
range <- c("2016"=2,"July 2017"=1)

ui <- dashboardPage(
  dashboardHeader(title="Membership Satisfaction"),
  dashboardSidebar(
    sidebarMenu(
      menuItem("Value Dashboard", tabName = "dashboard", icon = 
icon("dashboard")),
  menuItem("Services Dashboard", tabName = "service", icon = 
icon("dashboard")),
  menuItem("Demographics Dashboard", tabName = "demos", icon = 
icon("dashboard"))
    )
  ),
  dashboardBody(
    tabItems(

      tabItem(tabName = "demos",
          sidebarPanel(
            checkboxGroupInput("inpt","Select variables to plot", choices = 
            choices),
            checkboxGroupInput("role", 
                               "Select Primary Role of Interest", 
                               choices = role),
            checkboxGroupInput("yrs", 
                               "Select year(S) of Interest", 
                               choices = range)),
          fluidPage(

            plotOutput("test")  

          )))))

и мой сервер:

server <- function(input,output){


  x <- reactive({
    example1 %>%
    dplyr::filter(Product == as.integer(input$inpt))%>%
    dplyr::filter(year == as.integer(input$range)) %>%
    dplyr::filter(status == as.integer(input$role)) %>%
    pull(-2)
   })


  y <- reactive({
    example1 %>%
      dplyr::filter(Product == as.integer(input$inpt+1))%>%
      dplyr::filter(year == as.integer(input$range)) %>%
      dplyr::filter(status == as.integer(input$role)) %>%
      pull(-1)
  })

  z <- reactive({data.frame(x= x(), y = y())})


  output$test <- renderPlot({

    ggplot(z(), aes(x,y))+ 
    geom_point(colour ="green", shape = 17, size=5 )+ 
    labs(x = "Mean Satisfaction", y = "Mean Importance") + 
    xlim(0,5) + ylim(0,5)+
    geom_vline(xintercept=2.5) + geom_hline(yintercept =  2.5)})


       }



   shinyApp (ui = ui, server = server)

Примечания:

Example1 - это блок данных с обобщенными средними значениями по группе, году и продукту.

Фильтры переменных X и Y позволяют получить код конкретного продукта и хранить только средние значения. Y является соответствующим и всегда произведением (x + 1). Он получает среднее для y и хранит эти вейлы. Переменная Z затем создает кадр данных координатных точек x, y для построения графика.

Пример1 заголовка данных:

> example1
# A tibble: 24 x 5
# Groups:   year, status [12]
    year status Product AvgComImpt AvgComSat
    <dbl>  <dbl> <fct>        <dbl>     <dbl>
 1    1.     1. 1           NaN         2.70
 2    1.     1. 2             3.13    NaN   
 3    1.     2. 1           NaN         2.43
 4    1.     2. 2             3.33    NaN   
 5    1.     3. 1           NaN         2.40
 6    1.     3. 2             3.60    NaN   
 7    1.     5. 1           NaN         3.03
 8    1.     5. 2             3.30    NaN   
 9    1.     7. 1           NaN         3.50
10    1.     7. 2             4.00    NaN   


> dput(head(example1))
structure(list(year = c(1, 1, 1, 1, 1, 1), status = c(1, 1, 2, 
2, 3, 3), Product = structure(c(1L, 2L, 1L, 2L, 1L, 2L), .Label = c("1", 
"2"), class = "factor"), AvgComImpt = c(NaN, 3.12844036697248, 
NaN, 3.33333333333333, NaN, 3.6), AvgComSat = c(2.7037037037037, 
NaN, 2.42857142857143, NaN, 2.4, NaN)), .Names = c("year", "status", 
"Product", "AvgComImpt", "AvgComSat"), row.names = c(NA, -6L), class = 
c("grouped_df", 
"tbl_df", "tbl", "data.frame"), vars = c("year", "status"), drop = TRUE, 
indices = list(
0:1, 2:3, 4:5), group_sizes = c(2L, 2L, 2L), biggest_group_size = 2L, labels 
= structure(list(
year = c(1, 1, 1), status = c(1, 2, 3)), row.names = c(NA, 
-3L), class = "data.frame", vars = c("year", "status"), drop = TRUE, .Names 
= c("year", 
"status")))

Теоретически это должно работать так:

Х получит это:

[1] 3.128440 3.333333 3.600000 3.296296 4.000000 4.000000 4.000000 4.234131 
4.254562 4.386861 4.090909 4.387218

Y получил бы это: [1] 2.703704 2.428571 2.400000 3.034483 3.500000 2.666667 4.000000 3.856167 4,045455 3,825000 3,818182 3,996377

и тогда мой Z получит это:

1  3.128440 2.703704
2  3.333333 2.428571
3  3.600000 2.400000
4  3.296296 3.034483
5  4.000000 3.500000
6  4.000000 2.666667
7  4.000000 4.000000
8  4.234131 3.856167
9  4.254562 4.045455
10 4.386861 3.825000
11 4.090909 3.818182
12 4.387218 3.996377

когда я запускаю его, в приложении говорится: «Ошибка: результаты должны иметь длину 2, а не 0».

Когда я делаю выбор по переменным для построения графика, он меняется на: «Ошибка: результаты должны иметь длину 1, а не 0».

Мне интересно, имеет ли это какое-либо отношение, если не выбран ни один ввод, и выдается ошибка, потому что фильтр захватывает ввод пользователя. Но если бы это было так, я бы подумал, что выбор во всех областях ввода, по крайней мере, даст график для этого - но это не так. Если это то, что я делаю неправильно, я понятия не имею, с чего начать ... любая помощь будет признательна!

Есть какие-либо материалы / идеи о том, как заставить этот код работать? СПАСИБО !!!!

...