R Shiny上传双文件时校验文件名指定片段一致的报错咨询
问题原因
- 多文件上传场景下,
input$bam返回的是包含name/size/type/datapath四列的数据框,你直接对整个数据框做正则匹配,无法正确提取文件名 - 页面初始化、用户未完成上传时,
input$bam为空值,此时调用str_extract_all返回空列表,取[[1]]/[[2]]会得到长度为0的向量,代入if判断就触发「参数长度为零」的报错 - 之前
validate写法错误,need的第二个参数直接传错误提示字符串即可,不需要嵌套print函数
修复后代码
data <- reactive({ # 校验必须上传2个文件才继续执行,避免空值报错 req(input$bam) validate(need(nrow(input$bam) == 2, "请上传2个对应的文件")) # 提取上传的文件名做匹配 file_names <- input$bam$name pattern <- "[0-9]{3}[:punct:][0-9]{5}[:punct:][A-Z]{3}[0-9]{8}" # 用str_extract替代str_extract_all,单个文件名只需匹配1次目标片段,匹配失败返回NA clean_file_1 <- str_extract(file_names[1], pattern) clean_file_2 <- str_extract(file_names[2], pattern) # 依次校验匹配有效性、片段一致性 validate( need(!is.na(clean_file_1) & !is.na(clean_file_2), "文件名未匹配到指定格式片段,请检查上传文件"), need(clean_file_1 == clean_file_2, "请上传DNA编号一致的pool1和pool2文件") ) # 所有校验通过后返回文件数据供后续逻辑使用 return(input$bam) })
补充说明
- 上述代码使用Shiny原生的
validate机制,校验失败时错误提示会自动展示在所有依赖该reactive的UI组件位置,不会抛出后台报错 - 如果需要弹出模态框提示错误,可在校验逻辑中搭配Shiny原生的
showModal(modalDialog())实现,无需额外安装依赖包
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

