modelTest出现树与数据标签不同、closure对象不可子集化报错如何解决
错误原因与解决方案
错误1:Labels in tree and data differ 标签不一致
触发原因:
- 定义模型向量时,
"WAG "、"Dayhoff "等模型名称尾部带有多余空格,导致模型匹配异常,触发标签校验逻辑报错 - 输入fasta文件的序列名存在重复、包含特殊符号(空格、中括号、竖线、斜杠等),或存在长度为0的空序列,导致内部自动生成NJ树时,树标签和序列标签无法对应
- 你设置的
maxit=10迭代次数过小,树优化提前终止,输出的树结构不完整,存在标签缺失
错误2:object of type 'closure' is not subsettable 闭包对象无法子集化
触发原因:
你第二次调用modelTest(Dat,phyDat,NULL)时未指定参数名,按位置传递参数时第二个参数默认为tree,你传入的phyDat是phangorn包的内置函数,R中函数属于closure类型。该报错来自modelTest内部对tree参数的子集提取操作,和你是否自行编写方括号子集代码无关。
修复步骤与可运行代码
- 先修改输入fasta文件的序列名,统一使用纯字母、数字、下划线命名,删除空格、特殊符号,确保无重复序列名、无空序列
- 移除模型名称中的多余空格,调大迭代次数,按参数名规范传参
library(ape) library(phangorn) file <- "C:/Users/ItCenter/Desktop/n.fasta" Dat <- read.phyDat(file, format = "fasta", type = "AA") # 预校验序列合法性 # 输出序列条数 length(Dat) # 检查是否存在重复序列名,返回TRUE则无重复 length(unique(names(Dat))) == length(Dat) # 检查是否存在空序列,返回TRUE则无空序列 all(nchar(as.character(Dat)) > 0) # 修正参数后的modelTest调用 mt <- modelTest( Dat, tree = NULL, model = c("WAG", "JTT", "LG", "Dayhoff", "cpREV", "mtmam", "mtArt", "MtZoa", "mtREV24", "VT", "RtREV", "HIVw", "HIVb", "FLU", "Blosum62", "Dayhoff_DCMut", "JTT_DCMut"), G = TRUE, I = TRUE, FREQ = FALSE, k = 4, control = pml.control(epsilon = 1e-08, maxit = 100, trace = 1), multicore = FALSE, mc.cores = NULL )
内容的提问来源于stack exchange,提问作者Haniyeh Nafisi
相关产品推荐
相关产品推荐

