Я пытаюсь построить реактивный график, который использует функции фильтра 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».
Мне интересно, имеет ли это какое-либо отношение, если не выбран ни один ввод, и выдается ошибка, потому что фильтр захватывает ввод пользователя. Но если бы это было так, я бы подумал, что выбор во всех областях ввода, по крайней мере, даст график для этого - но это не так. Если это то, что я делаю неправильно, я понятия не имею, с чего начать ... любая помощь будет признательна!
Есть какие-либо материалы / идеи о том, как заставить этот код работать? СПАСИБО !!!!