2016-08-09 14 views
1

Ich habe verschiedene Quellen von Code verschmolzen, um eine App zu erstellen, mit der man eine Datei hochladen kann (Datenrahmen).glänzend Auswahl bestimmter Spalten aus hochgeladenen Datenrahmen

Darüber hinaus möchte ich aber auch ermöglichen, bestimmte Spalten aus dem Datenrahmen auszuwählen und zu analysieren. Dies ist jedoch schwierig, da man den gegebenen Datenrahmen vordefinieren muss, um im ui.R Skript darauf zurückgreifen zu können. Wenn also ein vorher nicht definierter Datenrahmen auf die Seite hochgeladen wird, kann man ihn nicht verehren es in der ui.R wie es in dem Server definiert ....

vordefinierte Variablen

vchoices <- 1:ncol(mtcars) 
names(vchoices) <- names(mtcars) 

ui.R

runApp(
     ui = basicPage(
     h2('The uploaded file data'), 
     dataTableOutput('mytable'), 
     fileInput('file', 'Choose info-file to upload', 
        accept = c(
        'text/csv', 
        'text/comma-separated-values', 
        'text/tab-separated-values', 
        'text/plain', 
        '.csv', 
        '.tsv' 
       ) 
     ), 
     actionButton("choice", "incorporate external information"), 

     selectInput("columns", "Select Columns", choices=vchoices, inline = T), 
     #notice that the 'choices' in selectInput are set to the predefined 
     #variables above whereas I would like to set them equal to the 
     #not yet defined uploaded file below in server.R 

     tableOutput("table_display") 
    )) 

Beachten sie, dass die 'Entscheidungen' in selectInput sind auf die Voreinstellung eingestellt ned Variablen oben, während Ich mag würde unter ihnen gleich der noch nicht definiert hochgeladene Datei setzen in server.R

server.R

server = function(input, output) { 

     info <- eventReactive(input$choice, { 
     inFile <- input$file 
     if (is.null(inFile)) 
      return(NULL) 
     isolate(f<-read.table(inFile$datapath, header = T, 
           sep = "\t")) 
     f 
     }) 
     output$table_display<-renderTable({ 
     f<-info() 
     f<-subset(f, select=input$columns) #subsetting takes place here 
     head(f) 
     }) 
    } 

Kennt jemand eine Möglichkeit, auf eine Variable zu verweisen, die definiert ist in den Server, in der ui und damit interaktive Manipulation ermöglichen?

Antwort

3

Sie können eine Funktionsfamilie update*Input verwenden - in diesem Fall updateSelectInput. Das erste Argument muss session lauten und Sie müssen auch zu server <- function(input, output) hinzufügen, um Ihr Widget aktualisieren zu können.

Sie können das Widget sofort aktualisieren, nachdem Sie auf actionButton geklickt haben. Sie müssen updateSelectInput innerhalb von eventReactive verwenden.


Lassen Sie uns einen Blick darauf werfen, wie wir das tun können:

Zuerst Sie die Namen der Spalten des neuen hochgeladenen Daten-Set in einer Variablen speichern können, sagen wir, vars und sie dann an die Funktion übergeben updateSelectInput . (Die Auswahl der selectInput werden zunächst NULL gesetzt - wir sie nicht vor angeben müssen, weil sie aktualisiert werden, gehen sowieso)

info <- eventReactive(input$choice, { 
    inFile <- input$file 
    # Instead # if (is.null(inFile)) ... use "req" 
    req(inFile) 

    # Changes in read.table 
    f <- read.table(inFile$datapath, header = input$header, sep = input$sep, quote = input$quote) 
    vars <- names(f) 
    # Update select input immediately after clicking on the action button. 
    updateSelectInput(session, "columns","Select Columns", choices = vars) 

    f 
    }) 

Ich habe eine kleine upload interface hinzugefügt, um Ihre Code.

Die andere Möglichkeit wäre, Widgets auf der Serverseite zu definieren und sie dann über die Funktion renderUI an die Clientseite zu übergeben. Sie können here ein Beispiel finden.


Voll Beispiel:

library(shiny) 

ui <- fluidPage(
    h2('The uploaded file data'), 
    dataTableOutput('mytable'), 
    fileInput('file', 'Choose info-file to upload', 
      accept = c(
       'text/csv', 
       'text/comma-separated-values', 
       'text/tab-separated-values', 
       'text/plain', 
       '.csv', 
       '.tsv' 
      ) 
), 
    # Taken from: http://shiny.rstudio.com/gallery/file-upload.html 
    tags$hr(), 
    checkboxInput('header', 'Header', TRUE), 
    radioButtons('sep', 'Separator', 
       c(Comma=',', 
       Semicolon=';', 
       Tab='\t'), 
       ','), 
    radioButtons('quote', 'Quote', 
       c(None='', 
       'Double Quote'='"', 
       'Single Quote'="'"), 
       '"'), 
    ################################################################ 

    actionButton("choice", "incorporate external information"), 

    selectInput("columns", "Select Columns", choices = NULL), # no choices before uploading 

    tableOutput("table_display") 
) 

server <- function(input, output, session) { # added session for updateSelectInput 

    info <- eventReactive(input$choice, { 
    inFile <- input$file 
    # Instead # if (is.null(inFile)) ... use "req" 
    req(inFile) 

    # Changes in read.table 
    f <- read.table(inFile$datapath, header = input$header, sep = input$sep, quote = input$quote) 
    vars <- names(f) 
    # Update select input immediately after clicking on the action button. 
    updateSelectInput(session, "columns","Select Columns", choices = vars) 

    f 
    }) 

    output$table_display <- renderTable({ 
    f <- info() 
    f <- subset(f, select = input$columns) #subsetting takes place here 
    head(f) 
    }) 
} 
shinyApp(ui, server) 
+0

funktioniert perfekt, außer der Tatsache, dass ich einen Fehler, wenn ich Eingang zunächst die Daten, da keine Spalten haben ausgewählt- gewesen, die ein bisschen chaotisch aussieht ... Gibt es eine Möglichkeit, die Anzeige der Tabelle zu verschieben, bis ich die Spalten zif (Eingabe $ Spalten) {f <- Teilmenge (f, select = Eingabe $ Spalten)} ??? Vielen Dank –

+0

Natürlich gibt es einen sehr schönen Weg, es mit der Funktion 'req' oder mit'validate' zu ​​tun. Platzieren Sie einfach in 'render *' -Funktion als eine erste Zeile 'req (Eingabe $ xyz)'. Sie können es als "erfordern, dass Eingabe $ xyz verfügbar ist" lesen. Über [hier] (http://shiny.studio.com/articles/req.html) finden Sie eine nette Diskussion, die sich mit dem Umgang mit fehlenden Eingaben beschäftigt. –

Verwandte Themen