使用文件夹内容

时间:2016-07-27 14:19:56

标签: r drop-down-menu shiny

这是我与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())
  })

})

正如您所看到的,我正在使用数据框来处理这个问题,但如果这些文件夹的内容发生变化,这应该更好。因此,我认为最好的方法是获取文件夹名称列表,然后获取该文件夹的内容并将其加载到第二个下拉列表中。我已经在SO上试了几个帖子,但它们主要是关于csv文件的内容等等。任何帮助将不胜感激。

由于

2 个答案:

答案 0 :(得分:0)

您可以使用list.files功能获取文件的名称。

所以这样的事情应该有效:

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

答案 1 :(得分: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所做的一切基本上都是承诺我会渲染两个名为&#39; select.folder&#39;的UI元素。和&#39; select.file&#39;在server.R中。这非常简单。

在server.R中,我指定root,我希望应用程序在其中查找目录。

我使用renderUI()生成一个UI元素,用户将在其中选择文件夹并将其存储在output$select.folder中,履行我在ui.R中的第一个承诺,给它一个&#39的标签;文件夹名称&#39;,并将其选择设置为使用适当参数调用的list.dirs()(来自基础R)的结果。用户在此UI元素中选择的选项可通过input$folder.name访问,因为InputId为'folder.name'

我再次使用renderUI()生成一个UI元素,用于选择该文件夹中的文件并将其存储在output$select.file中,以实现我对ui.R的第二个承诺。它的选择基于对list.files的调用,该调用使用在第一个UI元素中选择的文件夹,通过`input $ folder.name&#39;检索它。