You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shiny应用中用verbatimTextOutput与shinyDirChoose显示目录路径的问题

解决Shiny应用目录选择路径显示的错误问题

问题背景

开发Shiny应用用于选择CSV文件的导入/导出目录,需在按钮下方文本框显示所选路径,但遇到以下问题:

  • 初始代码:未选目录时显示character(0),选目录后报错object of type 'environment' is not subsettable
  • 修改后代码:选目录时正常显示路径,但未选目录时报错$ operator is invalid for atomic vectors

初始代码

#This is the test page for step 1: set the import and export directories

library(shiny)
library(shinyFiles)


########## User interface ##########
ui = fluidPage(
  
  h5(strong('Select target directory for importing raw data:')),
  
  
  shinyDirButton('folderImp', 
                 'Directory Selection', 
                 'Please select a folder'),
  
  verbatimTextOutput("dir_input_text"),
  
  h5(strong('Select target directory for exporting analysis results:')),
  
  shinyDirButton('folderExp', 
                 'Directory Selection', 
                 'Please select a folder'),
  
  verbatimTextOutput("dir_output_text")
  
)#close ui, fluidpage


########## Server logic #########

server = function(input, output, session) {
  
  #### Input for user browse and data upload ####
  
  switch(Sys.info()[['sysname']],
         Windows= {main_dir <- "c:/Users"},
         Linux  = {main_dir <- "/usr"},
         Darwin = {main_dir <- "~"}) #R script running on a mac
  
  shinyDirChoose(input, 
                 'folderImp', 
                 session=session,
                 roots=c(main = main_dir),
                 filetypes = c('csv'),
                 hidden = FALSE,
                 allowDirCreate = FALSE)
  
  input_pathway <- reactive({parseDirPath(session, input$folderImp) })

  output$dir_input_text <- renderPrint({ input_pathway() })
  
  
  #### Export directory for analysis results ####
  
  shinyDirChoose(input, 
                 'folderExp', 
                 session=session,
                 roots=c(main = main_dir),
                 filetypes = c('csv'),
                 hidden = FALSE,
                 allowDirCreate = FALSE)
  
  output_pathway <- reactive({parseDirPath(session, input$folderExp) })
  
  output$dir_output_text <- renderPrint({ output_pathway() })
  
} # close server

shinyApp(ui = ui, server = server)

修改后的代码(存在未选目录报错问题)

shinyDirChoose(input, 
                 'folderImp', 
                 session=session,
                 roots=c(main = main_dir),
                 filetypes = c('csv'),
                 hidden = FALSE,
                 allowDirCreate = FALSE)
  
  input_pathway <- reactive({ input$folderImp })

  output$dir_input_text <- renderText({ paste(input_pathway()$path[-1], collapse = "/") })
  
  
  #### Export directory for analysis results ####
  
  shinyDirChoose(input, 
                 'folderExp', 
                 session=session,
                 roots=c(main = main_dir),
                 filetypes = c('csv'),
                 hidden = FALSE,
                 allowDirCreate = FALSE)
  
  output_pathway <- reactive({ input$folderExp })
  
  output$dir_output_text <- renderText({ paste(output_pathway()$path[-1], collapse = "/") })

解决方案

问题根源是未选择目录时,input$folderImp和input$folderExp是原子向量而非列表,直接访问$path会报错。只需在访问路径前先判断是否为有效列表,若未选择则显示友好提示。

修正后的完整服务器逻辑代码:

server = function(input, output, session) {
  
  #### Input for user browse and data upload ####
  
  switch(Sys.info()[['sysname']],
         Windows= {main_dir <- "c:/Users"},
         Linux  = {main_dir <- "/usr"},
         Darwin = {main_dir <- "~"}) #R script running on a mac
  
  shinyDirChoose(input, 
                 'folderImp', 
                 session=session,
                 roots=c(main = main_dir),
                 filetypes = c('csv'),
                 hidden = FALSE,
                 allowDirCreate = FALSE)
  
  output$dir_input_text <- renderText({
    # 判断是否已选择目录
    if(is.list(input$folderImp)){
      paste(input$folderImp$path[-1], collapse = "/")
    } else {
      "未选择导入目录"
    }
  })
  
  
  #### Export directory for analysis results ####
  
  shinyDirChoose(input, 
                 'folderExp', 
                 session=session,
                 roots=c(main = main_dir),
                 filetypes = c('csv'),
                 hidden = FALSE,
                 allowDirCreate = FALSE)
  
  output$dir_output_text <- renderText({
    # 判断是否已选择目录
    if(is.list(input$folderExp)){
      paste(input$folderExp$path[-1], collapse = "/")
    } else {
      "未选择导出目录"
    }
  })
  
} # close server

关键说明

  • 使用is.list()判断用户是否已选择目录:未选择时input$folderImp是长度为0的原子向量,选择后变为包含path元素的列表
  • 未选择时返回友好提示文本,替代报错;选择时正常拼接路径

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 12:28:08