2015-12-30 12 views
5

Ho un'app lucida che seleziona il file xlsx/csv e la carica nel sistema e dopo il caricamento, desidero popolare i nomi delle colonne della tabella dati che ho estratto in un selectInput() o selectizeInput().Come passare valori (scelte) per selezionareIngresso() dopo aver selezionato i dati dall'interfaccia utente nell'app lucida?

Il codice qui sotto rappresenta un evento di utenza il caricamento del file di dati

ui.R

library(markdown) 
    require(XLConnect) 


    shinyUI(navbarPage(img(class="img-polaroid", 
     src=paste0("http://www.iconsdb.com/icons/preview/black/stackoverflow-5-xl.png")), 

     tabPanel("Table", 
      titlePanel("Select Data"), 
      sidebarLayout(
      sidebarPanel(
       selectInput("fileType", "Select File Type:", 
        c("MS Excel Worksheet (xls,xlsx)" = "xls", 
         "Text/CSV (.csv)" = "csv" 
        ) 
        ), 
       fileInput('file1', 'Choose file to upload', 
        accept = c(
         'text/csv', 
         'text/comma-separated-values', 
         'text/tab-separated-values', 
         'text/plain', 
         '.csv', 
         '.tsv', 
         'application/vnd.ms-excel', 
         'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 
         '.xlsx', 
         '.xls' 
        ) 
       ), 
       tags$hr(), 
       checkboxInput('header', 'Header', TRUE), 
       radioButtons('sep', 'Separator', 
        c(Comma=',', 
         Semicolon=';', 
         Tab='\t'), 
        ','), 
       radioButtons('quote', 'Quote', 
        c(None='', 
         'Double Quote'='"', 
         'Single Quote'="'"), 
        '"'), 
       tags$hr() 


      ), 
      mainPanel(
       dataTableOutput('table') 
      ) 
     ) 

     ), 
     tabPanel("Plot", 
      sidebarLayout(
      sidebarPanel(
       radioButtons("plotType", "Plot type", 
        c("Scatter"="p", "Line"="l") 
       ) 
      ), 
      mainPanel(
       plotOutput("plot") 
      ) 
     ) 
     ), 
     navbarMenu("More", 
      tabPanel("Summary", 
      verbatimTextOutput("summary") 
     ) 
     ) 
    )) 

server.R

shinyServer(
    function(input, output, session) 
     { 
     output$plot <- renderPlot({ 
     plot(data$Count,data$Sales, type=input$plotType) 
     }) 

     output$summary <- renderPrint({ 
     summary(data) 
     }) 

     output$table <- renderDataTable({ 
     inFile <- input$file1 

     if (is.null(inFile)) 
      return(NULL) 
     if(input$fileType=='csv'){ 
      table1<-read.csv(inFile$datapath, header = input$header, 
       sep = input$sep, quote = input$quote) 
      return(table1) 
     } else if(input$fileType=='xls'){ 
      table1 <- readWorksheetFromFile(inFile$datapath, sheet=1) 
     } 

     }) 
    } 
) 

Abbastanza corretto, ora ho un sistema funzionante di input che può ricevere dati dalla fonte di Excel o da un testo/CSV. Successivamente, desidero creare una lista dinamica che trasmetta i valori di colnames(output$table) al mio ui.R e li metta nel posto designato.

Come faccio?


Ho provato con uiOutput() dalla risposta di Mason DeCamillis per How to get vector of options from server.R to ui.R for selectInput in Shiny R App ma R mi sta lanciando un errore "Oggetto non trovato".

Inoltre, mi è venuto in mente che devo usare reactive() per poter passare i dati da e verso l'interfaccia utente e il server. Ma nessun indizio, come lo faccio.

+0

[questo articolo] (http://shiny.rstudio.com/articles/dynamic-ui.html) è un riferimento utile per chiunque tenti di comprendere la risposta di @NicE di seguito, o in genere iniziare con le interfacce utente reattive in Brillante. – alistaire

risposta

8

È possibile memorizzare la tabella caricata in una variabile data nello server.R e utilizzare il codice dal collegamento inviato per riempire lo selectInput.

Nella tua server.R, si potrebbe fare:

data <- reactive({ 
    inFile <- input$file1 
    if (is.null(inFile)) 
     return(NULL) 
    if(input$fileType=='csv'){ 
     table1<-read.csv(inFile$datapath, header = input$header, 
         sep = input$sep, quote = input$quote) 
     return(table1) 
    } else if(input$fileType=='xls'){ 
     table1 <- readWorksheetFromFile(inFile$datapath, sheet=1) 
    } 
    }) 

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

    output$selector <- renderUI({ 
     selectInput("var", "Choose name:", as.list(colnames(data()))) 
    }) 

e nel tuo ui.R, aggiungi uiOutput("selector") in cui si desidera che l'elenco sia.

+0

E come utilizzare nuovamente la variabile selezionata nel 'server.R' ?? 'print (output $ selector)' lancia un errore 'Object output not found'. La seguente affermazione è un metodo corretto ?? 'var <-reactive (output $ selector <- renderUI ({ selectInput (" var "," Scegli nome: ", as.list (colnames (data()))) }))' – sunitprasad1

+0

@ sunitprasad1 È necessario utilizzare 'input $ selector' per ottenere il valore della variabile selezionata come al solito. Quindi avresti qualcosa del tipo: 'var <- reactive ({x <- input $ selector; print (x)})'. – user5029763

Problemi correlati