这是我与R闪亮的第一天,我正试图弄清楚以下问题:假设我有一个根目录,如
/usr/data/
此目录可能包含一些文件夹(A,B,C,...),其中每个文件夹包含一些文件(其中没有文件夹,只包含文件)。我打算根据另一个下拉菜单创建一个下拉菜单。使用从列表中选择文件夹名称,第二个下拉菜单自动加载该文件夹中的文件名。例如,如果选择了文件夹A
并且其中包含File1
和File2
,则第二个下拉列表将包含这两个。这就是我现在正在做的事情:
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文件的内容等等。任何帮助将不胜感激。
由于
答案 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;检索它。