如何在R Shiny中上传含多文件夹的目录并读取所有JSON文件
R Shiny 实现目录选择与递归读取所有JSON文件
完整可运行代码
library(shiny) library(jsonlite) ui <- fluidPage( titlePanel("批量读取目录下所有JSON文件"), sidebarLayout( sidebarPanel( shinyDirButton("dir", "选择目标目录", "请选择包含子文件夹的目录"), actionButton("load_btn", "开始读取JSON文件") ), mainPanel( verbatimTextOutput("file_count"), verbatimTextOutput("sample_content") ) ) ) server <- function(input, output, session) { # 存储选择的目录路径 selected_dir <- reactiveVal(NULL) # 处理目录选择事件 shinyDirChoose(input, "dir", roots = c(home = normalizePath("~")), session = session) observeEvent(input$dir, { if (!is.null(input$dir)) { # 解析选择的目录路径 dir_path <- parseDirPath(c(home = normalizePath("~")), input$dir) selected_dir(dir_path) } }) # 处理读取按钮点击事件 json_data_list <- eventReactive(input$load_btn, { req(selected_dir()) # 递归查找所有JSON文件 json_files <- list.files(path = selected_dir(), pattern = "\\.json$", recursive = TRUE, full.names = TRUE) if (length(json_files) == 0) { return(NULL) } # 读取所有JSON文件到列表 lapply(json_files, function(file) { fromJSON(file) }) }) # 输出找到的文件数量 output$file_count <- renderPrint({ req(json_data_list()) cat(sprintf("共找到并读取 %d 个JSON文件\n", length(json_data_list()))) }) # 输出第一个文件的内容预览 output$sample_content <- renderPrint({ req(json_data_list()) if (length(json_data_list()) > 0) { cat("第一个JSON文件内容预览:\n") str(json_data_list()[[1]]) } }) } shinyApp(ui, server)
关键说明
- 目录路径解析:
shinyDirChoose返回的是结构化路径,必须用parseDirPath转换为系统可识别的绝对路径,这是很多人遇到空界面或路径错误的核心原因。 - 递归查找文件:
list.files设置recursive=TRUE可以遍历所有子文件夹,pattern="\\.json$"确保只匹配JSON文件,full.names=TRUE返回完整文件路径方便读取。 - 触发逻辑:用
actionButton触发读取操作,避免目录选择后立即读取(可能用户还没选好),同时用req()确保依赖项存在后再执行逻辑,防止报错。 - 空界面问题排查:如果之前出现空界面,大概率是没有正确渲染输出内容(比如没加
verbatimTextOutput这类输出组件),或者路径解析错误导致没有找到文件。
内容的提问来源于stack exchange,提问作者ksinva
相关产品推荐
相关产品推荐

