R Шинни Ошибка при использовании реактивного на сюжет - PullRequest
2 голосов
/ 10 марта 2020

У меня есть этот набор данных:

Area <- c("Mexico", "USA", "USA", "Canada").

Type_of_participants <- c("Doctor", "Doctor", "Engineer", "Dancer".

Salary <- c("4000", "6000", "8000", "5000").

, и я пытаюсь построить базу зарплаты на основе пользовательских данных Area (level1) и Type_of_participants (level2), но ничего не появляется. Я изменил aes на aes_string, когда посмотрел здесь. Пожалуйста, помогите мне найти ошибку

Мой код

`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(input$selection,Type) %>%
     filter (input$selection %in% input$baseinput) %>%
     summarise(avg_salary_by_area = mean(Salary, na.rm = TRUE)) %>%
     select(input$selection, Type, avg_Salary_by_area)
      })

    output$Overview <- renderPlot({
    ggplot(data= dt1())+
     aes(fill = Type)+
      geom_bar(x=input$selection, y = avg_salary_by_area,stat="identity", 
           position = position_dodge())

В результате я могу выбрать вход, но не могу визуализировать график. Ошибка "неизвестный столбец Площадь или неизвестность Тип участников

Пожалуйста, помогите мне найти ошибку

Спасибо

*** Обновление

Спасибо г-ну Флик, я исправил свой код, но он по-прежнему сообщает об ошибке "Область объекта не найдена". Пожалуйста, помогите сообщить. Большое спасибо

  `dt1 <- reactive({
  df[df[,input$selection] %in% input$baseinput,] %>%
  group_by(input$selection,Type) %>%
  summarise(avg_score_by_area = mean(Score, na.rm = TRUE))
  })

 output$Overview <- renderPlot({

 ggplot(data= dt1(),aes_string(x= input$selection, 
                              y = "avg_score_by_area",fill = "Type"))+
 geom_bar(stat="identity", 
           position = position_dodge())`

1 Ответ

0 голосов
/ 11 марта 2020

@ 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...