2016-07-27 102 views
0

這是我有一天[R閃亮創建下拉菜單,我想弄清楚以下問題:假設我有一個像[R閃亮使用文件夾內容

/usr/data/ 

根目錄,此目錄可能包含一些文件夾(A,B,C,...)中每個文件夾都包含一些文件(文件夾中沒有文件夾,只有文件)。我打算根據另一個下拉菜單創建一個下拉菜單。使用從列表中選擇一個文件夾名稱,第二個下拉菜單會自動加載該文件夾中的文件名稱。例如,如果選擇文件夾A並且它包含File1File2,則第二個下拉列表將包含這兩個。這是我如何做它現在:

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()) 
    }) 

}) 

正如你所看到的,我使用一個數據幀照顧但如果這些文件夾的內容發生變化,這應該更好地動態化。所以我認爲最好的方法是獲取文件夾名稱列表,然後獲取該文件夾的內容並將它們加載到第二個下拉列表中。我曾嘗試過幾篇文章,但主要是關於csv文件的內容等等。任何幫助將非常感激。

感謝

回答

0

我建議以下列方式產生被動的UI元素:

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)))) 

}) 

我在ui.R中完成的所有工作基本上都承諾,我將在server.R中呈現兩個名爲'select.folder'和'select.file'的UI元素。這很簡單。

在server.R中,我指定了root,我希望應用程序查找目錄。

我用renderUI()生成在用戶將選擇的文件夾並將其存儲在output$select.folder,履行我在ui.R第一承諾UI元素,給它「文件夾名稱」的標籤,並設置其選擇,使用適當的參數調用list.dirs()(來自基礎R)的結果。用戶在此UI元素中選擇的選項將通過input$folder.name訪問,因爲InputId是'folder.name'

我再次使用renderUI()來生成一個UI元素,將用於選擇該文件夾中的一個文件並將其存儲在output$select.file中,履行我對ui.R的第二個承諾。它的選擇基於對list.files的調用,該調用使用在第一個UI元素中選擇的文件夾,通過`input $ folder.name'檢索它。

+0

我沒有足夠的聲望來投票你的答案,但謝謝你的詳細解釋。謝謝 – dagg3r

0

你可以得到的文件的名稱與功能list.files一個文件夾中。

所以這樣的事情應該工作:

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