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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:20:23