使用ape包与Bayestraites时R遇致命错误,疑为树文件异常?
问题:使用ape包root函数定根进化树时出错,Bayestraites包触发致命错误
操作流程
- 读取树文件并转为phylo类:
pomptree <- "Pomptrees" PompTree <- ape::read.nexus(pomptree)
- 定义外类群:
Outgroup <- c("Brachycistis_alcanor_U51B22","Brachycistis_curvata_U72B92","Brachycistis_petiolata_U68B68", "Dasymutilla_blattoserica_U88JP841","Dasymutilla_creon_U87JP670","Dasymutilla_monticola_U85JP371","Dasymutilla_quadrigutatta_U83JP313", "Invreiella_cephalargia_PS113")
- 执行定根操作:
PompTreeRoot <- root(PompTree, Outgroup, resolve.root = TRUE, edgelabel = TRUE)
遇到的错误
- 执行root函数时出现:
Error in x$edge[neworder, ] : invalid subscript type 'any',有时R直接致命崩溃 - 使用Bayestraites包时触发:
Error in phy$edge.lenght[-terms] : only 0's may be mixed with negative subscripts
排查与解决方法
针对ape包root函数的错误
验证phylo对象的合法性
用ape内置函数检查树结构是否存在异常:ape::checkValidPhylo(PompTree) str(PompTree)重点确认
$edge(节点连接矩阵)、$tip.label(末端标签)、$edge.length(分支长度)字段是否完整、格式正确,无重复节点或缺失值。确认外类群与树标签完全匹配
检查外类群列表中的每个名称是否都存在于树的末端标签中,避免拼写错误(大小写、下划线、编号差异):match_result <- Outgroup %in% PompTree$tip.label # 查看不匹配的外类群 Outgroup[!match_result]修正不匹配的名称,或调整树的标签以保持一致。
简化操作逐步测试
- 先移除
resolve.root和edgelabel参数,执行基础定根:PompTreeRoot <- root(PompTree, Outgroup) - 如果成功,再逐个添加参数测试,定位问题来源;也可以先尝试用单个外类群定根,排除多外类群导致的分支冲突。
- 先移除
更新ape包版本
旧版本ape可能存在已知bug,更新到最新版重试:install.packages("ape")
针对Bayestraites包的错误
检查分支长度字段的拼写与完整性
错误提示中的edge.lenght是拼写错误(正确为edge.length),先确认代码或函数调用中是否存在拼写失误。同时检查树对象的分支长度:# 检查是否有缺失值 sum(is.na(PompTree$edge.length)) # 检查是否有负数或0值 any(PompTree$edge.length < 0)补全缺失的分支长度,移除或修正异常值(进化树分支长度不能为负)。
确保输入为有根树
Bayestraites部分功能要求输入有根树,先确认定根后的树结构正确,再传入包中处理。更新Bayestraites包
同样尝试更新到最新版本,修复可能存在的版本兼容问题:install.packages("Bayestraites")
内容的提问来源于stack exchange,提问作者Brenna
相关产品推荐
相关产品推荐

