studio - r plot legend
R variables de paso brillante de la lista de selección a la gráfica reactiva (1)
Estoy haciendo mis primeros intentos con un paquete brillante, es increíble. Pero, como de costumbre, estoy enfrentando algunos problemas. Me las arreglé, siguiendo un brillante tutorial y googleing, para mostrar dos trazados diferentes de diferentes estaciones meteorológicas, pero ambos mostrando la misma variable.
Quería agregar otra lista de entrada para que sea posible elegir qué var a graficar. Al intentar ejecutar el script, parece que se ejecuta sin ningún error, pero no aparece ningún gráfico, solo los menús seleccionados.
Tal vez haya un error al pasar las variables al servidor. R, por lo tanto, las gráficas de los ejes oblicuos no se construyen correctamente, solo una suposición. Intenté trabajar de manera general creando funciones dependiendo de los vars de entrada, pero me falta algo, tal vez sobre la reactividad, tal vez sobrepasar correctamente a los vars, ...
Estos son los códigos para ui.R
library("shiny")
shinyUI(pageWithSidebar(
headerPanel(''Comparación de zonas - Temperatura''),
sidebarPanel(
selectInput("panel1", "Zona:",
list("Zona 1" = "1",
"Zona 2" = "2",
"Zona 3" = "3",
"Zona 4" = "4")),
selectInput("panel2", "Zona:",
list("Zona 1" = "1",
"Zona 2" = "2",
"Zona 3" = "3",
"Zona 4" = "4")),
selectInput("var", "Variable:",
list("tempc" = "tempc",
"relhum" = "relhum")),
helpText(''Al seleccionar la zona se crearán automáticamente
el gráfico de evolución temporal.'')
),
mainPanel(
conditionalPanel(condition = "inputId == ''panel1''",plotOutput(''myplot'')
),
conditionalPanel(condition = "inputId == ''panel2''",plotOutput("myplot")
)
)
))
y servidor.R
library(shiny)
library(plyr)
library(ggplot2)
shinyServer(function(input, output) {
formulaText <- reactive(function() {
paste("Gràfica de ggplot: Zona ", input$zona1)
})
# Return the formula text for printing as a caption
output$caption <- reactiveText(function() {
formulaText()
})
# datasets
datos=read.table("data.dat",header=T)
data=as.data.frame(datos)
data=within(data, datetime <- as.POSIXct(paste(date, time),format = "%Y%m%d %H%M%S"))
rams <- reactive({
subset(data,data$stat_id %in% places$stat_id[places$Zona == input$panel1])
})
plot <- function(var) {
p <- ggplot(rams(),aes(x=datetime, y=var, colour=as.character(stat_id))) +
geom_line()
}
plot=p(input$var)
if(input$var == "tempc") {
plot <- plot + ylab("Temperatura (ºC)") + xlab(" ") +
ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") +
scale_y_continuous(limits = c(-20,ylim),breaks=c(seq(-20,ylim,by=2))) }
if (input$var == "relhum") {
plot <- plot +
ylab("Humedad relativa (%)") + xlab(" ") +
ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") +
scale_y_continuous(limits = c(0,100),breaks=c(seq(0,100,by=5))) }
output$myplot <- reactivePlot(function() {
print(plot)
})
})
Gracias de antemano por su ayuda y consejo
Finalmente lo he tenido éxito. Los problemas se encontraban tanto en la forma en que se pasan las variables desde la entrada ui.R al servidor.R como en cómo ggplot trata con dicha entrada. Tuve que usar aes_string para administrar nombres de variables. Ahora, las dos primeras listas de selección permiten seleccionar el marco de datos utilizado en los trazados superior e inferior, mientras que el tercero selecciona la variable que se va a trazar, mediante la creación de diferentes comandos ggplot.
Aunque el script funciona ahora mismo, existen algunos problemas para optimizar el código, por lo que puede funcionar de una manera más general. Construyo dos marcos de datos diferentes al subconjunto del más grande y tal vez es mejor tener solo un subconjunto. He definido dos salidas de trazado (myplot1 y myplot2) ya que no pude encontrar cómo gestionar solo una para los dos paneles condicionales. Todavía hay trabajo, pero como novato en brillante estoy feliz de que esté funcionando.
En cualquier caso, adjunto el código que funciona para mí y espero que ayude a alguien:
ui.R
library("shiny")
shinyUI(pageWithSidebar(
headerPanel(''Comparación de zonas - Temperatura''),
sidebarPanel(
selectInput("panel1", "Zona:",
list("Zona 1" = "1",
"Zona 2" = "2",
"Zona 3" = "3")),
selectInput("panel2", "Zona:",
list("Zona 1" = "1",
"Zona 2" = "2",
"Zona 3" = "3")),
selectInput("var", "Variable:",
list("tempc" = "tempc",
"relhum" = "relhum")),
helpText(''Al seleccionar la zona se crearán automáticamente
el gráfico de evolución temporal.'')
),
mainPanel(
conditionalPanel(condition = "inputId == ''panel1''",plotOutput(outputId=''myplot1'')),
conditionalPanel(condition = "inputId == ''panel2''",plotOutput(outputId=''myplot2''))
)
))
servidor.R
library(shiny)
library(plyr)
library(ggplot2)
shinyServer(function(input, output) {
datos=read.table("data.dat",header=T)
pobles=read.table("pobles-zona.dat",header=T)
data=as.data.frame(datos)
places=as.data.frame(pobles)
data$time[data$time == "0"] = "000000"
data$time[data$time == "10000"] = "010000"
data$time[data$time == "20000"] = "020000"
data$time[data$time == "30000"] = "030000"
data$time[data$time == "40000"] = "040000"
data$time[data$time == "50000"] = "050000"
data$time[data$time == "60000"] = "060000"
data$time[data$time == "70000"] = "070000"
data$time[data$time == "80000"] = "080000"
data$time[data$time == "90000"] = "090000"
data=within(data, datetime <- as.POSIXct(paste(date, time),format = "%Y%m%d %H%M%S"))
formulaText <- reactive(function() {
paste("Gràfica de ggplot: Zona ", input$panel1, input$panel2, input$var)
})
# Return the formula text for printing as a caption
output$caption <- reactiveText(function() {
formulaText()
})
rams1 <- reactive({
subset(data,data$stat_id %in% places$stat_id[places$Zona == input$panel1])
})
rams2 <- reactive({
subset(data,data$stat_id %in% places$stat_id[places$Zona == input$panel2])
})
p <- function(data){
p=ggplot(data(),aes_string(x="datetime", y=input$var,colour="as.character(stat_id)")) +
geom_line()
}
output$myplot1 <- reactivePlot(function() {
gtitol=paste("Zona ",input$panel1)
yx=round(max(rams1()$tempc)+2)
yn=round(min(rams1()$tempc)-2)
plot=p(rams1)
if ( input$var == "tempc" ) {
plot=plot + ylab("Temperatura (ºC)") + xlab(" ") +
ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") +
scale_y_continuous(limits = c(yn,yx),breaks=c(seq(yn,yx,by=2)))
}
if ( input$var == "relhum" ){
plot=plot + ylab("Humedad relativa (%)") + xlab(" ") +
ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") +
scale_y_continuous(limits = c(0,100),breaks=c(seq(0,100,by=5)))
}
print(plot)
})
output$myplot2 <- reactivePlot(function() {
gtitol=paste("Zona ",input$panel2)
yx=round(max(rams2()$tempc)+2)
yn=round(min(rams2()$tempc)-2)
plot=p(rams2)
if ( input$var == "tempc" ) {
ylim=max(rams2()$tempc)+2
plot=plot + ylab("Temperatura (ºC)") + xlab(" ") +
ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") +
scale_y_continuous(limits = c(yn,yx),breaks=c(seq(yn,yx,by=2)))
}
if ( input$var == "relhum" ) {
ylim=100
plot=plot + ylab("Humedad relativa (%)") + xlab(" ") +
ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") +
scale_y_continuous(limits = c(0,100),breaks=c(seq(0,100,by=5)))
}
print(plot)
})
})