Shiny no muestra mi ggplot como esperaba
ggplot2 (3)
¿Qué impide que mi pequeña aplicación Shiny muestre mi ggplot? Cuando reemplazo el código en renderPlot () con un ejemplo usando la función de trazado base, se junta. Estoy utilizando RStudio, R v3.0.1 en Windows Vista, obteniendo como salida un navegador Chrome.
ui.r
library(ggplot2)
cities <- c("Anchorage","Fairbanks","Juenau","Wasilla","Homer")
years <- 2003:2013
Table <- "Capital Assets"
Account <- c("Land", "Art", "Buildings", "Equipment")
dat <- data.frame(City = sort(rep(cities, length(years))), Year = rep(years,length(cities)), Table)
sampleDat <- rbind(data.frame(dat,Acount = Account[1]), data.frame(dat, Acount = Account[2]), data.frame(dat, Acount = Account[3]), data.frame(dat, Acount = Account[4]))
finalDat <- data.frame(sampleDat, Value = runif(length(sampleDat[,1]), 1000,10000) )
shinyUI(pageWithSidebar(
headerPanel("CAFR Explorer"),
selectInput("city","City", as.list(levels(finalDat$City)), selected = NULL, multiple = FALSE),
mainPanel(
h3(textOutput("caption")),
plotOutput("CAFRplot")
)))
server.r
library(shiny)
library(ggplot2)
cities <- c("Anchorage","Fairbanks","Juenau","Wasilla","Homer")
years <- 2003:2013
Table <- "Capital Assets"
Account <- c("Land", "Art", "Buildings", "Equipment")
dat <- data.frame(City = sort(rep(cities, length(years))), Year = rep(years,length(cities)), Table)
sampleDat <- rbind(data.frame(dat,Acount = Account[1]), data.frame(dat, Acount = Account[2]), data.frame(dat, Acount = Account[3]), data.frame(dat, Acount = Account[4]))
finalDat <- data.frame(sampleDat, Value = runif(length(sampleDat[,1]), 1000,10000) )
shinyServer(function(input, output) {
formulaText <- reactive({
paste(input$city)
})
output$caption <- renderText({
formulaText()
})
output$CAFRplot <- renderPlot({
## this one isn''t working.
ggplot(finalDat, aes(x = finalDat[which(finalDat$City == input$city),2],
y = finalDat[which(finalDat$City == input$city),5])) +
geom_point()
## this one is working
#plot(finalDat[which(finalDat$City == input$city),2], y = finalDat[which(finalDat$City == input$city),5])
})
})
Hay dos problemas aquí.
Primero, no debe subconjuntar en aes
, espera nombres de columna. En su lugar, subconjúlelos data.frame que proporciona a ggplot
(gracias a @Roland desde el chat R)
En segundo lugar, debe print
explícitamente su objeto ggplot en su brillante aplicación.
Prueba esto:
p <- ggplot(finalDat[finalDat$City == input$city,], aes(x = Year, y = Value))
p <- p + geom_point()
print(p)
Tu código necesitaba un par de cambios para hacer que ggplot
renderizara. Como los comentarios anteriores dicen, se necesitó print(ggplot)
. Pero también, aes dentro de ggplot no puede tratar con subconjuntos.
Entonces, subconjunta su ciudad de interés en un reactivo separado, y lo llama desde ggplot.
city.df <- reactive({
subset(finalDat, City == input$city)
})
output$CAFRplot <- renderPlot({
city <- city.df()
print(ggplot(city, aes(x = Year, y=Value)) + geom_point())
El servidor completo.R (esto funciona)
library(shiny)
library(ggplot2)
cities <- c("Anchorage","Fairbanks","Juenau","Wasilla","Homer")
years <- 2003:2013
Table <- "Capital Assets"
Account <- c("Land", "Art", "Buildings", "Equipment")
dat <- data.frame(City = sort(rep(cities, length(years))), Year = rep(years,length(cities)), Table)
sampleDat <- rbind(data.frame(dat,Acount = Account[1]), data.frame(dat, Acount = Account[2]), data.frame(dat, Acount = Account[3]), data.frame(dat, Acount = Account[4]))
finalDat <- data.frame(sampleDat, Value = runif(length(sampleDat[,1]), 1000,10000) )
shinyServer(function(input, output) {
formulaText <- reactive({
paste(input$city)
})
output$caption <- renderText({
formulaText()
})
city.df <- reactive({
subset(finalDat, City == input$city)
})
output$CAFRplot <- renderPlot({
city <- city.df()
## this one isn''t working.
# print(ggplot(finalDat, aes(x = finalDat[which(finalDat$City == input$city),2],
# y = finalDat[which(finalDat$City == input$city),5])) + geom_point())
print(ggplot(city, aes(x = Year, y=Value)) + geom_point())
## this one is working
#plot(finalDat[which(finalDat$City == input$city),2], y = finalDat[which(finalDat$City == input$city),5])
})
})
En ggplot2
puede subconjuntar los datos generales que se pasan a todas las capas (@ respuesta de GSee) o, para capas individuales, puede usar el argumento de subconjunto para subconjuntos solo para esa capa. Esto puede ser útil si está construyendo parcelas más complejas.
Usando la función plyr
.
es útil aquí para construir los argumentos
# required in server.R (along with the other calls to library)
library(plyr)
p <- ggplot(finalDat, aes(y =Year, x = Value)) +
geom_point(subset = .(City ==input$city))
print(p)