Нет выходной графики в 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")
)
))