R Shiny RIS文件去重应用崩溃问题排查与优化咨询
问题排查与解决方案
1. 解决data.frame行不匹配崩溃问题
报错arguments imply differing number of rows: 0, 1的核心原因是:当导入的RIS文件为空(或解析后无有效条目)时,后续代码尝试创建/合并data.frame时,某个向量长度为0,另一个为1(比如给空数据添加标记列、统计列等操作)。
修复步骤:
- 在
Start Duplicate Check按钮的触发逻辑开头,添加导入数据的有效性校验:observeEvent(input$start_check, { req(input$ris_file) ris_data <- readLines(input$ris_file$datapath) # 检查RIS内容是否为空或无有效条目 if(length(ris_data) == 0 || all(ris_data == "")){ showModal(modalDialog( title = "错误", "上传的RIS文件为空或无有效引用条目,请重新上传。", easyClose = TRUE )) return() } # 后续解析、重复检查逻辑... }) - 解析RIS后再次校验数据框行数:
df <- convert2df(...) if(nrow(df) == 0){ showModal(modalDialog( title = "错误", "未解析到有效引用条目,请检查RIS文件格式是否正确。", easyClose = TRUE )) return() }
2. 修复convert2df识别RIS标识为路径的错误
这个错误是因为使用bibliometrix::convert2df时参数传递错误:默认情况下,函数会将第一个参数当作文件路径,而你直接传入了RIS文本行,导致函数误把RIS标识(如TY - JOUR)当成文件路径去查找。
正确调用方式:
当你直接传入RIS文本内容(而非文件路径)时,需要明确指定source = "ris"和format = "text":
library(bibliometrix) # 读取上传的RIS文件内容 ris_content <- readLines(input$ris_file$datapath) # 正确解析RIS文本为数据框 df <- convert2df(ris_content, source = "ris", format = "text")
如果是直接传入文件路径,则可以简化为:
df <- convert2df(input$ris_file$datapath, source = "ris")
3. 代码优化建议
- 输入验证强化:在文件上传控件添加
accept = ".ris"限制格式,同时在服务器端校验文件扩展名:req(input$ris_file) file_ext <- tools::file_ext(input$ris_file$name) if(tolower(file_ext) != "ris"){ showModal(modalDialog( title = "错误", "请上传RIS格式的文件。", easyClose = TRUE )) return() } - 错误捕获与友好提示:用
tryCatch包裹解析、重复检查等核心逻辑,避免应用崩溃:observeEvent(input$start_check, { tryCatch({ # 核心逻辑代码... }, error = function(e){ showModal(modalDialog( title = "运行错误", paste("错误信息:", e$message), easyClose = TRUE )) }) }) - 重复识别逻辑优化:使用模糊匹配提升重复检测准确性,比如结合标题(
stringdist计算编辑距离)、作者、年份:library(stringdist) # 标题标准化(转小写、去标点) df$title_clean <- tolower(gsub("[[:punct:]]", "", df$TI)) # 计算标题相似度,筛选潜在重复 duplicates <- which(stringdistmatrix(df$title_clean, df$title_clean, method = "jw") < 0.1 & df$PY == df$PY & df$AU == df$AU, arr.ind = TRUE) - UI交互反馈:添加加载状态提示,比如在点击按钮后显示进度条或加载动画:
observeEvent(input$start_check, { showModal(modalDialog("正在检查重复条目...", footer = NULL)) # 核心逻辑... removeModal() # 显示结果... })
内容的提问来源于stack exchange,提问作者Mouse B.
相关产品推荐
相关产品推荐

