2017-02-22 41 views
0

Я хочу обновить ggplot. Здесь я использовал функцию графика, но вместо этого хочу использовать ggplot, который обновляется автоматически. GGplot автоматически обновляется с помощью selectsizeinput. Как это сделать ?? Заранее спасибо.Как обновить Ggplot с помощью selectsize input в R shiny

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

Вот пример ggplot, который обновляет на основе selectInput и SelectizeInput. Насколько я понимаю, вы хотели бы построить более одной переменной по оси y, поэтому я использовал data.table для melt данных в 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)