为什么Shiny-app不响应用户输入

时间:2019-02-05 16:29:22

标签: r ggplot2 graph shiny shiny-reactivity

我正在尝试构建一个闪亮的Web应用程序,以允许不同的用户输入,然后相应地绘制图形/输出数据表。我正在使用WHO的自杀率数据,并且有两种可能的图表类型:条形图和折线图。

用户可以选择在绘制x轴为年龄组(条形图)还是年份(折线图)的图之间进行选择。他们还可以选择分别绘制男性和女性以及不同国家/地区的图表。

下面的代码适用于所有情况,除非用户用x axis = year选择gender = 'gender neutral'。该错误表明找不到对象速率。但是,包含目标速率的代码块在其他地方也可以很好地工作。

library(shiny)
library(dplyr)
library(ggplot2)


setwd("C:\\Users\\Lenovoi7\\Shrewsbury School\\IT\\Coursework")

who<-data.frame(read.csv("who.csv",  stringsAsFactors = TRUE))
dput(head(who))
countries<-sort(unique(who$country))
countries<-union(countries, c("World"))
ui<-fluidPage(

  titlePanel("Suicide statistics"),

  sidebarLayout(
  sidebarPanel(

selectInput(
  inputId="x",
  label="Please choose the x variable",
  choices=c("",
            "Age group"="age",
            "Year"="year")),

conditionalPanel(

  condition = "input.x == 'age' || input.x == 'year'",

  selectInput( 

    inputId = "gender",
    label = "Please specify the gender characteristics", 
    choices = c("", "Gender neutral" = "gender_neutral",
                "Gender specific" = "gender_specific"),
    selected = NULL), 

  #nested conditional panel
  #only show this panel if the input is gender_specific

  conditionalPanel(

    condition = "input.gender == 'gender_specific'",

    selectInput(
      inputId = "country",
      label = "Select a country:", 
      choices = countries,
      selected = "Bosnia and Herzegovina")),

  conditionalPanel(

    condition = "input.gender == 'gender_neutral'",

    selectInput(
      inputId = "country",
      label = "Select a country:", 
      choices = countries,
      selected = "Bosnia and Herzegovina")))),

mainPanel(

  plotOutput("graph")


  )))

server <- function(input, output) {

  x<-reactive({input$x})

  gender<-reactive({input$gender})

  country<-reactive({input$country})

  output$graph <- renderPlot(

   #x axis = age group 

   if (x()=="age"){

    if (gender()=="gender_neutral"){

      if (country()=="World"){

      ggplot(data=who, aes(x=age)) + geom_bar(aes(weights=suicides_no), position="dodge")}

    else {

      #create a new subset of data that will be used??
      who_subset<-subset(who, country == input$country)

      ggplot(data=who_subset, aes(x=age)) + geom_bar(aes(weights=suicides_no))}}

  else if (gender()=="gender_specific"){

    if (country()=="World"){

      ggplot(data=who, aes(x=age)) + geom_bar(aes(weights=suicides_no, fill=sex), position="dodge")}

    else {

      #create a new subset of data that will be used??
      who_subset<-subset(who, country==input$country)

      ggplot(data=who_subset, aes(x=age)) + geom_bar(aes(weights=suicides_no, fill=sex), position="dodge")}}}

else if (x()=="year"){

  if (gender()=="gender_neutral"){

    if (country()=="World"){

      who_all <- who %>% 
        group_by(year) %>% 
        summarize(suicides_no = sum(suicides_no),
                  population = sum(population)) %>%
        mutate(rate = 100000 * suicides_no/population)

      ggplot() + 
        geom_line(data = who_all, aes(year, rate))

    }

    else {

      who_subset<-subset(who, country==input$country)

      who_sub_sex <- who_subset %>% 
        group_by(year) %>% 
        summarize(suicides_no = sum(suicides_no),
                  population = sum(population)) %>%
        mutate(rate = 100000 * suicides_no/population)

      ggplot() + 
        geom_line(data = who_subset, aes(year, rate)) 

    }}

  else if (gender()=="gender_specific"){

    if (country()=="World"){

      who_all <- who %>% 
        group_by(year) %>% 
        summarize(suicides_no = sum(suicides_no),
                  population = sum(population)) %>%
        mutate(rate = 100000 * suicides_no/population)

      ggplot() + 
        geom_line(data = who_all, aes(year, rate)) 


    }

    else {

      #create a new subset of data that will be used??
      who_subset<-subset(who, country==input$country)

      who_sub_sex <- who_subset %>% 
        group_by(year, sex) %>% 
        summarize(suicides_no = sum(suicides_no),
                  population = sum(population)) %>%
        mutate(rate = 100000 * suicides_no / population)

          ggplot() + 
            geom_line(data = who_sub_sex, aes(year, rate, color = sex))}

      }

    }
)}

# Create a Shiny app object
shinyApp(ui = ui, server = server)

dput(head(who))  
structure(list(country = structure(c(1L, 1L, 1L, 1L, 1L, 1L), 
.Label =   c("Albania", 
"Anguilla", "Antigua and Barbuda", "Argentina", "Armenia", "Aruba", 
"Australia", "Austria", "Azerbaijan", "Bahamas", "Bahrain", "Barbados", 
"Belarus", "Belgium", "Belize", "Bermuda", "Bolivia", 
"Bosnia and     Herzegovina", 
"Brazil", "British Virgin Islands", "Brunei Darussalam", "Bulgaria", 
"Cabo Verde", "Canada", "Cayman Islands", "Chile", "Colombia", 
"Costa Rica", "Croatia", "Cuba", "Cyprus", "Czech Republic", 
"Denmark", "Dominica", "Dominican Republic", "Ecuador", "Egypt", 
"El Salvador", "Estonia", "Falkland Islands (Malvinas)", "Fiji", 
"Finland", "France", "French Guiana", "Georgia", "Germany", "Greece", 
"Grenada", "Guadeloupe", "Guatemala", "Guyana", "Haiti", "Honduras", 
"Hong Kong SAR", "Hungary", "Iceland", "Iran (Islamic Rep of)", 
"Iraq", "Ireland", "Israel", "Italy", "Jamaica", "Japan", "Jordan", 
"Kazakhstan", "Kiribati", "Kuwait", "Kyrgyzstan", "Latvia", "Lithuania", 
"Luxembourg", "Macau", "Malaysia", "Maldives", "Malta", "Martinique", 
"Mauritius", "Mayotte", "Mexico", "Monaco", "Mongolia", "Montenegro", 
"Montserrat", "Morocco", "Netherlands", "Netherlands Antilles", 
"New Zealand", "Nicaragua", "Norway", "Occupied Palestinian Territory", 
"Oman", "Panama", "Paraguay", "Peru", "Philippines", "Poland", 
"Portugal", "Puerto Rico", "Qatar", "Republic of Korea", 
"Republic of     Moldova", 
"Reunion", "Rodrigues", "Romania", "Russian Federation",
"Saint Kitts and Nevis", 
"Saint Lucia", "Saint Pierre and Miquelon", 
"Saint Vincent and Grenadines", 
"San Marino", "Sao Tome and Principe", "Saudi Arabia", "Serbia", 
"Seychelles", "Singapore", "Slovakia", "Slovenia", "South Africa", 
"Spain", "Sri Lanka", "Suriname", "Sweden", "Switzerland", 
"Syrian Arab Republic", 
"Tajikistan", "TFYR Macedonia", "Thailand", "Trinidad and Tobago", 
"Tunisia", "Turkey", "Turkmenistan", "Turks and Caicos Islands", 
"Ukraine", "United Arab Emirates", "United Kingdom", 
"United States of America", 
"Uruguay", "Uzbekistan", "Venezuela (Bolivarian Republic of)", 
"Virgin Islands (USA)", "Zimbabwe"), class = "factor"), 
year = c(1985L, 1985L, 1985L, 1985L, 1985L, 1985L), 
sex = structure(c(1L, 1L, 1L, 1L, 1L, 1L),.
Label = c("female", "male"), class = "factor"), 
age = structure(1:6, .Label = c("15-24 years", "25-34 years", 
"35-54 years", "5-14 years", "55-74 years", "75+ years"),
class  = "factor"), 
suicides_no = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_), population = c(277900L, 246800L, 
267500L, 298300L, 138700L, 34200L)), 
row.names = c(NA, 6L), class = "data.frame")

有人有办法解决这个问题吗?再次,我希望Web应用程序在用户选择x axis = yeargender = gender_neutral时输出折线图。

1 个答案:

答案 0 :(得分:0)

尝试使用此服务器代码。

更改已在我的评论中描述。由于我没有catch data.frame,因此无法测试。

who