旧R代码调用tcR包repOverlap函数报错vars必须为字符向量求助
问题根因
你遇到的报错是tcR包与高版本dplyr的兼容性问题:tcR 2.2.4最后更新于2019年,适配的是dplyr 1.0.0以下的版本,而你当前环境安装的dplyr 1.0.7对grouped_df()函数的参数校验规则更新,要求vars必须为字符向量,旧版tcR的内部调用不符合这个要求,因此触发报错。
解决思路(按实现成本从低到高排序)
方案1:降级dplyr到兼容版本
直接安装tcR适配的dplyr版本即可快速修复问题,执行以下代码:
# 若未安装remotes包先执行:install.packages("remotes") remotes::install_version("dplyr", version = "0.8.5", repos = "http://cran.us.r-project.org")
如果你的其他项目需要用到高版本dplyr,可使用renv包为当前项目创建独立的R包环境,避免版本冲突。
方案2:本地修复tcR的repOverlap函数
如果不想降级dplyr,可以手动修改tcR内部调用grouped_df()的代码:
- 运行
getAnywhere(repOverlap)获取该函数的完整源码 - 找到调用
dplyr::grouped_df()的行,将传入的vars参数外层套上as.character()转换 - 把修改后的代码赋值给自定义函数(如
repOverlap_fixed),后续调用自定义函数即可。
方案3:自行实现Morisita指数计算
如果你只需要计算Morisita相似性指数,完全可以脱离tcR包自己实现,避免后续再出现依赖兼容性问题,参考代码如下:
# 输入参数说明:df_list是包含两个免疫组库数据框的列表,seq_col为序列列名,freq_col为频率/计数列名 calc_morisita <- function(df_list, seq_col = "nuc", freq_col = "Read.count") { # 合并两个样本的序列数据,缺失值补0 merged_df <- merge( df_list[[1]][, c(seq_col, freq_col)], df_list[[2]][, c(seq_col, freq_col)], by = seq_col, all = TRUE ) merged_df[is.na(merged_df)] <- 0 # 转为相对频率 p <- merged_df[[paste0(freq_col, ".x")]] / sum(merged_df[[paste0(freq_col, ".x")]]) q <- merged_df[[paste0(freq_col, ".y")]] / sum(merged_df[[paste0(freq_col, ".y")]]) # 计算Morisita指数 2 * sum(p * q) / (sum(p^2) + sum(q^2)) }
内容的提问来源于stack exchange,提问作者AnnaVyborova
相关产品推荐
相关产品推荐

