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
相关产品推荐
相关产品推荐

