@ Suz ie - как упомянуто выше, было бы полезно, если бы вы отредактировали свой вопрос с помощью полного кода, как он у вас есть в настоящее время.
Несколько вещей, которые могут помочь:
- Заработная плата должна быть цифрой c в вашем
df
(или конвертироваться с as.numeric
, прежде чем пытаться взять среднее - Ваше выражение
reactive
может использовать !!as.symbol
с input$selection
для фильтр по имени строки из df
- График может использовать
aes_string
для имен переменных.
Редактировать :
Для дальнейшего объяснения !!as.symbol
, сначала рассмотрим, каков результат input$selection
. Если вы используете browser()
в своем блестящем коде и посмотрите, что возвращает input$selection
, вы увидите что-то вроде "Area"
(он возвращает строку ). Но строка не подходит для вашего filter
- она ожидает символ, представляющий столбец в вашем фрейме данных. (Символ - это имя объекта, например df
или mtcars
, и т. Д. * 1068). *.)
Сначала вы хотите преобразовать строку в символ. Вы можете сделать это либо с помощью нг as.symbol()
или rlang::sym()
. Вы можете попробовать это в своей консоли. Если вы сделаете as.symbol("df")
, он вернет символ df
. Если вы ввели eval(as.symbol("df"))
, это было бы то же самое, что и просто ввести df
(и отобразилось бы содержимое вашего фрейма данных).
Другая проблема заключается в том, что функции tidyverse
оценивают выражения кода в специальный контекст (например, поиск имен внутри фрейма данных). В этом случае dplyr
знает, что имя Area
находится в контексте df
(одно из имен столбцов). Это усложняющий фактор, поскольку приводятся аргументы. Чтобы решить эту проблему, вам нужно заключить в кавычки (заменить имя на его значение) оператором bang-bang !!
.
Соединяя их вместе, вы получите !!as.symbol()
.
. varSelectInput
- это новейшая блестящая альтернатива selectInput
, которую можно рассматривать для использования в подобных ситуациях.
Для получения дополнительной информации:
специальные темы Блестящая мета
продвинутый R
library(tidyverse)
library(shiny)
Area <- c("Mexico", "USA", "USA", "Canada")
Type_of_participants <- c("Doctor", "Doctor", "Engineer", "Dancer")
Salary <- c(4000, 6000, 8000, 5000)
df <- data.frame(Area, Type_of_participants, Salary)
ui <- fluidPage(
titlePanel("Survey Results"),
sidebarLayout(
sidebarPanel(strong("Overview Plot"),
br(),
###1a.Area input
selectInput("selection","Var",
choices = c("Area","Type_of_participants"),
selected = "Area"),
uiOutput("choice_selection")
),
mainPanel(
plotOutput("Overview")
)
)
)
server <- function(input, output) {
output$choice_selection <- renderUI({
checkboxGroupInput("baseinput", "Detail", unique(df[,input$selection]))
})
dt1 <- reactive({
df %>%
group_by(Area, Type_of_participants) %>%
filter(!!as.symbol(input$selection) %in% input$baseinput) %>%
summarise(avg_salary_by_area = mean(Salary, na.rm = TRUE))
})
output$Overview <- renderPlot({
ggplot(data = dt1(), aes_string(x = input$selection, y = "avg_salary_by_area", fill = "Type_of_participants")) +
geom_bar(stat="identity", position = position_dodge())
})
}
shinyApp(ui, server)