Нет выходной графики в Shiny R

R пользователи и все программисты,

Я хотел бы попросить его о помощи для моего первого блестящего приложения. Поскольку у меня нет опыта работы в области компьютерных наук, мой вопрос, вероятно, тривиален для многих пользователей. Но если кто-нибудь может дать некоторые подсказки, это будет высоко ценится.

Я пытаюсь нарисовать интерактивную графику для средней температуры в Лондоне, Париже и Берлине. Я загрузил данные с www.wunderground.com, используя пакет weatherData. Я использую примеры из книги Криса Били и Rstudio, чтобы разработать собственное приложение.

В моем server.R я загружаю три файла данных в первую очередь. Затем у меня есть боковая панель с элементами управления, чтобы выбрать набор данных. У меня также есть диапазон дат на боковой панели. Как только пользователи выбирают местоположение и временной диапазон, я прошу R выполнить некоторую компоновку данных и передать объект passData для следующей операции. К тому времени, когда R достигает renderplot(), я предполагаю, что R имеет правильный фрейм данных и создает графику, используя ggplot2. Но я получаю следующее сообщение об ошибке.

Ошибка печати (theGraph): объект 'theGraph' не найден

Это заставляет меня думать, что R может не иметь правильного фрейма данных для генерации выходной графики. Интересно, кто-нибудь может заметить, что я здесь делаю неправильно? Мне также интересно, хорошо ли делать упорядочивание данных в реактивном (). Большое спасибо за ваше внимание и поддержку.

Я оставляю свои коды здесь.

### ui.R

library(shiny)

shinyUI(pageWithSidebar(

    headerPanel("Europe temperature 2013"),

    sidebarPanel(

        selectInput("dataset", "Choose a location",
                    choices = c("Berlin Tigel Airport",
                                "London City Airport",
                                "Paris Charles De Gaulle")
                   ),

        dateRangeInput("daterange", "Date Range",
                       start = "2013-01-01",
                       end = "2013-12-31",
                       min = "2013-01-01",
                       max = "2013-12-31"
                      )
                ),

    mainPanel(

        plotOutput("theGraph")

    )
))

server.R

### Weather server.R


library(shiny)
library(weatherData)
library(ggplot2)
library(scales)
library(plyr)

### load weather data.
berlin <- read.csv("berlin.csv", header = T)

london <- read.csv("london.csv", header = T)

paris <- read.csv("paris.csv", header = T)




shinyServer(function(input, output){

    # Return the requested dataset

    datasetInput <- reactive({

        switch(input$dataset,
                "Berlin Tigel Airport" = berlin,
                "London City Airport" = london,
                "Paris Charles De Gaulle" = paris)
    })


    # Prepare data once and then pass around the program.

    passData <- reactive({

        foo <- datasetInput()
        foo$shortdate <- strftime(foo$Time, format = "%Y-%m-%d")
        foo$shortdate <- as.Date(foo$shortdate, format = "%Y-%m-%d")

        foo <- foo[foo$shortdate %in%
                        seq.Date(input$daterange[1],
                        input$daterange[2], by = 1), ]

        foo

    })



    output$theGraph <- renderPlot({

            graphdata <- ddply(passData(), .(shortdate), summarize, mean_C = mean(TemperatureC)) 

            if(input$dataset == "berlin"){

                theGraph <- ggplot(graphdata(), aes(shortdate, mean_C)) +
                                    geom_line() +
                                    scale_x_date(labels = date_format("%Y-%m-%d")) +
                                    xlab("") +
                                    ylab("Mean Temperature (C)") +
                                    ggtitle("2013 Average Daily Temperature in Berlin")
            }

            if(input$dataset == "london"){

                theGraph <- ggplot(graphdata(), aes(shortdate, mean_C)) +
                                    geom_line() +
                                    scale_x_date(labels = date_format("%Y-%m-%d")) +
                                    xlab("") +
                                    ylab("Mean Temperature (C)") +
                                    ggtitle("2013 Average Daily Temperature in London")
            }

            if(input$dataset == "paris"){

                theGraph <- ggplot(graphdata(), aes(shortdate, mean_C)) +
                                    geom_line() +
                                    scale_x_date(labels = date_format("%Y-%m-%d")) +
                                    xlab("") +
                                    ylab("Mean Temperature (C)") +
                                    ggtitle("2013 Average Daily Temperature in Paris")
            }

            print(theGraph)
    })
})

Пример моих csv файлов.

### The files look like this. Three columns (Time, Temperature C, TemperatureF)

Time                 TemperatureC   TemperatureF

2013-01-01 01:00:00        6              NA

С уважением, Кота

1 ответ

Решение

Если у вас есть проблемы, упростите и сделайте пример независимым. Я сократил пример до 1 станции, использовал предварительно загруженный набор сэмплов, чтобы сделать пример автономным, и исправил ошибки, например, graphdata вместо graphdata(). Используйте это для перезапуска с дополнительными местоположениями.

server.R

# server.R

### Weather server.R
library(shiny)
library(weatherData)
library(ggplot2)
library(scales)
library(plyr)



### load weather data.
data(Mumbai2013) # we could not reproduce your example


shinyServer(function(input, output){

  # Return the requested dataset
  datasetInput <- reactive({

    switch(input$dataset,
           "Mumbai" = Mumbai2013)
  })


  # Prepare data once and then pass around the program.

  passData <- reactive({

    foo <- datasetInput()
    foo$shortdate <- strftime(foo$Time, format = "%Y-%m-%d")
    foo$shortdate <- as.Date(foo$shortdate, format = "%Y-%m-%d")

    foo <- foo[foo$shortdate %in%
                 seq.Date(input$daterange[1],
                          input$daterange[2], by = 1), ]
    foo

  })



  output$theGraph <- renderPlot({

    graphdata <- ddply(passData(), .(shortdate), summarize, mean_C = mean(Temperature)) 
    theGraph = NULL

    theGraph <- ggplot(graphdata, aes(shortdate, mean_C)) +
        geom_line() +
        scale_x_date(labels = date_format("%Y-%m-%d")) +
        xlab("") +
        ylab("Mean Temperature (C)") +
        ggtitle("2013 Average Daily Temperature in Mumbai")
    if (!is.null(theGraph))
      print(theGraph)
  })
})

ui.R

# ui.R
library(shiny)

shinyUI(pageWithSidebar(

  headerPanel("Europe temperature 2013"),

  sidebarPanel(

    selectInput("dataset", "Choose a location",
                choices = c("Mumbai")
    ),

    dateRangeInput("daterange", "Date Range",
                   start = "2013-01-01",
                   end = "2013-12-31",
                   min = "2013-01-01",
                   max = "2013-12-31"
    )
  ),

  mainPanel(

    plotOutput("theGraph")

  )
))
Другие вопросы по тегам