2017-02-22 46 views
0

我想更新ggplot。這裏我使用了plot函數,但是我想用ggplot來自動更新。 GGplot使用chooseizeinput自動更新。怎麼做 ??提前致謝。如何更新Ggplot與選擇R輸入輸入

ui.r 
library(shiny) 

shinyUI(fluidPage(
    titlePanel("Multivariable plot"), 

    sidebarLayout(
    sidebarPanel(
     fileInput("file", label = h3("Select CSV File")), 
     checkboxInput(inputId = 'header', label = 'col names', value = TRUE), 
     radioButtons(inputId = 'sep', label = 'Seperator', choices = c("comma"=',',"semi comma"=';'), selected = ','), 

     #checkboxGroupInput("choices1", label = h3("Wybierz Kolumny"), choices = NULL), 
     # there is combobox to pick column 
     selectInput("combobox", label = h3("x var"),choices = NULL), 
    #selectInput("combobox1", label = h3("y var"),choices = NULL) 
    selectizeInput("combobox1", label = h3("y var"), choices = NULL ,multiple = TRUE) 

    ), 

    mainPanel(
     uiOutput("tb") 
    ) 
) 
)) 
server.r 

function(input, output, session){ 

    data <- reactive({ 
    file1 <- input$file 
    if(is.null(file1)){return()} 
    dataSet <- read.csv(file=file1$datapath, sep=input$sep, header = input$header) 

    #updateCheckboxGroupInput(session, "choices1", choices = colnames(dataSet)) 
    # this line updates selection in combobox 
    updateSelectInput(session, "combobox", choices = colnames(dataSet)) 
    updateSelectizeInput(session, "combobox1", choices = colnames(dataSet), server = TRUE) 
    dataSet 
    }) 

    output$table <- renderTable({ 
    if(is.null(data())){return()} 
    data()  
    }) 

    output$multivarplot <- reactivePlot(function(){ 
    x <- data()[, input$combobox] 
    ydat <- data.frame(data()[, input$combobox1]) 

    xval<-data.frame(x,ydat) 
    # ggplot(xval, aes(x = reorder(x, -x), y = y))+geom_point(colour='red') 
    #g= ggplot(xval, aes(x,ydat[,1]))+geom_point(colour='red') 

    ny <- ncol(ydat) 
     par(mfcol=c(12,12),mfrow=c(1,1)) 

     if(ny==1) 
      plot.default(x,ydat[,1],xaxt="n",col="blue") 
    axis(1, at=1:length(xval$x),labels = xval$x) 
if  (ny==2) 
     { y1 <- ydat[,1] 
     y2 <- ydat[,2] 
    plot.default(x, y1, ylim = range(c(y1,y2)),col='red') 
     points(x,y2)} 

    }) 


    output$tb <- renderUI({ 
     tabsetPanel(tabPanel("Table", tableOutput("table")), 

        tabPanel("Plot", 
          plotOutput("multivarplot"))) 
    }) 
} 
+0

請舉一個最小的例子來重現您不喜歡的行爲並提供詳細的預期。 – HubertL

回答

0

這裏是,更新基於所述selectInputSelectizeInput一個ggplot的一個例子。據我所知,你想在y軸上繪製多於一個變量,所以我用data.tablemelt將數據轉換成data.table三列(x_var,variable,value),即長格式。該轉換(以及其他任何計算)可能/應該被移至data()反應函數。

library(shiny) 
library(ggplot2) 
library(data.table) 

ui <- shinyUI(fluidPage(
    titlePanel("Multivariable plot"), 
    sidebarLayout(
    sidebarPanel(
     fileInput("file", label = h3("Select CSV File")), 
     checkboxInput(inputId = 'header', label = 'col names', value = TRUE), 
     radioButtons(inputId = 'sep', label = 'Seperator', 
     choices = c("comma"=',',"semi comma"=';'), selected = ','), 
     selectInput("combobox", label = h3("x var"), choices = NULL), 
     selectizeInput("combobox1", label = h3("y var"), choices = NULL, 
     multiple = TRUE) 
    ), 
    mainPanel(
     tabsetPanel(tabPanel("Table", tableOutput("table")), 
        tabPanel("Plot", plotOutput("multivarplot"))) 
    ) 
) 
)) 

server <- function(input, output, session){ 

    data <- reactive({ 
    file1 <- input$file 
    if(is.null(file1)){return()} 
    dataSet <- read.csv(file=file1$datapath, sep=input$sep, 
     header = input$header) 
    updateSelectInput(session, "combobox", choices = colnames(dataSet)) 
    updateSelectizeInput(session, "combobox1", choices = colnames(dataSet), 
     server = TRUE) 
    dataSet 
    }) 

    output$table <- renderTable({ 
    data()  
    }) 

    output$multivarplot <- renderPlot({ 
    dt <- data.table(data()) 
    x_var <- input$combobox 
    y_var <- input$combobox1 
    if (!is.null(x_var) & !is.null(y_var)) { 
     dt_melt <- melt(dt, id.vars = x_var, measure.vars = y_var) 
     ggplot(dt_melt, aes_string(x = x_var, y = "value", group = "variable", 
          colour = "variable")) + geom_point(size = 3) 
    } 
    }) 
} 

shinyApp(ui = ui, server = server)