2013-11-21 35 views
10

我正在用閃亮的包進行第一次嘗試,它很棒。但是,像往常一樣,我面臨一些問題。我已經管理,遵循閃亮的教程和谷歌,顯示兩個不同的氣象站的不同情節,但都顯示相同的變量。從選擇列表到反應圖的R閃亮通過變量

enter image description here

我想添加其他輸入列表,從而有可能選擇哪個變種是要繪製。當試圖運行腳本時,它似乎運行時沒有任何錯誤,但沒有出現劇情,只是選擇了菜單。 enter image description here

也許在將變量傳遞給server.R時出現錯誤,所以輸出oblima圖不能正確構建,只是猜測。試圖創建函數的一般方式,取決於輸入工作瓦爾但我失去了一些東西,也許有關反應,也許正確地傳遞瓦爾...

這些是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") 
    )  
) 
)) 

代碼和server.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) 
    }) 

}) 

預先感謝您的幫助和建議

+0

'情節= P(輸入$ var)'是錯的 –

+0

是的,但這不是唯一的問題。請參閱下面的答案。謝謝。 – pacomet

+0

很高興知道'aes_string()',比你張貼這個答案。 –

回答

10

最後我成功了。問題出在兩個變量從ui.R輸入傳遞給server.R以及ggplot如何處理這樣的輸入。我不得不使用aes_string來管理變量名稱。現在,通過創建不同的ggplot命令,兩個第一選擇列表允許選擇上/下圖中使用的數據幀,而第三個選擇列表選擇要繪製的變量。

儘管腳本正在運行,但仍然存在一些優化代碼的問題,因此它可以以更一般的方式工作。我通過對更大的子集進行子集化來構造兩個不同的數據幀,也許最好只有一個子集。我已經定義了兩個繪圖輸出(myplot1和myplot2),因爲我找不到如何管理兩個條件面板中的一個。還有工作,但作爲一個閃亮的新手,我很高興它正在運行。

在任何情況下,我附上的代碼爲我工作,並期望它會幫助別人:

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')) 
) 
)) 

server.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) 
    }) 
})