2016-07-27 16 views
0

Das ist mein Tag mit R glänzend ist und ich versuche, die folgende Frage, um herauszufinden: unter der Annahme, dass ich ein Stammverzeichnis habe wier glänzend Inhalt Dropdown-Menü Ordner erstellen

/usr/data/ 

könnte Dieses Verzeichnis enthält einige Ordner (A, B, C, ...), in denen jeder Ordner einige Dateien enthält (keine Ordner darin und nur Dateien). Ich plane, ein Dropdown-Menü basierend auf einem anderen Dropdown-Menü zu erstellen. Die Verwendung wählt einen Ordnernamen aus der Liste und das zweite Dropdown-Menü wird automatisch mit den Dateinamen in diesem Ordner geladen. Wenn zum Beispiel der Ordner A ausgewählt ist und File1 und File2 enthält, enthält das zweite Dropdown diese beiden. Dies ist, wie ich es jetzt tue:

ui.R

library(shiny) 
shinyUI(fluidPage(
    titlePanel("This is a test app"), 

    sidebarLayout(
    sidebarPanel(
     uiOutput("Box1"), 
     uiOutput("Box2") 
    ), 
    mainPanel("Display results", 
       tableOutput("view")) 
) 
)) 

server.R

library(shiny) 
biz = data.frame(
    Folder = c("A", "A", "B" , "B"), 
    Filename = c("File1","File2","File3","File4"), 
    stringsAsFactors = FALSE 
) 
shinyServer(function(input, output) { 


    output$Box1 = renderUI(selectInput("folder","Select directory",c("None",unique(biz$Folder)),"None")) 


    output$Box2 = renderUI(
    if (is.null(input$folder) || input$folder == "None"){return() 
    }else selectInput("filename", 
         "Select dataset", 
         c("None",unique(biz$Filename[which(biz$Folder == input$folder)])), 
         "None") 
) 


    subdata1 = reactive(biz[which(biz$Folder == input$folder),]) 
    subdata2 = reactive(subdata1()[which(subdata1()$Filename == input$filename),]) 

    output$view = renderTable({ 
    if(is.null(input$folder) || is.null(input$filename)){return() 
    } else if (input$folder == "None" || input$filename == "None"){return() 

    } else return(subdata2()) 
    }) 

}) 

Wie Sie sehen können, bin ich ein Datenrahmen mit kümmern das sollte aber besser dynamisch sein, falls sich der Inhalt dieser Ordner ändert. Also denke ich, dass der beste Weg ist, eine Liste von Ordnernamen zu haben und dann den Inhalt dieses Ordners zu holen und sie in das zweite Dropdown-Menü zu laden. Ich habe mehrere Beiträge auf SO versucht, aber sie sind meist über den Inhalt einer CSV-Datei und so weiter. Jede Hilfe würde sehr geschätzt werden.

Dank

Antwort

0

Ich empfehle UI-Elemente reaktiv in der folgenden Art und Weise zu erzeugen:

ui.R

library(shiny) 

shinyUI(fluidPage(

    titlePanel("My Great File Selector"), 

    fluidRow(
    sidebarPanel(
     uiOutput("select.folder"), 
     uiOutput('select.file') 
    ) 
) 
)) 

server.R

library(shiny) 

shinyServer(function(input, output) { 

    root <- '~' 

    output$select.folder <- 
    renderUI(expr = selectInput(inputId = 'folder.name', 
           label = 'Folder Name', 
           choices = list.dirs(path = root, 
                full.names = FALSE, 
                recursive = FALSE))) 

    output$select.file <- 
    renderUI(expr = selectInput(inputId = 'file.name', 
           label = 'File Name', 
           choices = list.files(path = file.path(root, 
                     input$folder.name)))) 

}) 

Alles, was ich in ui.R getan habe, ist im Wesentlichen das Versprechen, dass ich zwei UI-Elemente mit dem Namen 'select.folder' und 'select.file' in server.R rendern werde. Das ist ziemlich einfach.

In Server.R, gebe ich root, wo ich möchte die App nach Verzeichnissen suchen.

I renderUI() verwenden, um ein UI-Element zu erzeugen, in dem der Benutzer den Ordner auswählen wird und speichert sie in output$select.folder, mein erstes Versprechen in ui.R erfüllen, gibt ihm eine Bezeichnung ‚Ordnernamen‘, und legen Sie seine Entscheidungen das Ergebnis von list.dirs() (von Base R) mit den entsprechenden Argumenten aufgerufen. Die Auswahl, die der Benutzer in diesem Oberflächenelement ausgewählt hat, ist über input$folder.name zugänglich, da die InputId 'folder.name' ist.

Ich benutze wieder renderUI(), um ein UI-Element zu generieren, das verwendet wird, um eine Datei in diesem Ordner auszuwählen und in output$select.file zu speichern, was meine zweite Zusage von ui.R erfüllt. Die Auswahl basiert auf einem Aufruf an list.files, der den im ersten UI-Element ausgewählten Ordner verwendet und ihn über `input $ folder.name 'abruft.

+0

Ich habe nicht genug Ruf, um Ihre Antwort zu bewerten, aber danke für die ausführliche Erklärung. Vielen Dank – dagg3r

0

Sie können die Namen der Dateien in einem Ordner mit der list.files Funktion erhalten.

So etwas wie dies funktionieren soll:

ROOT <- '/usr/data' 
dropdown_options <- list.files(paste(ROOT, input$folder, sep = '/'))