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

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参数的子集提取操作,和你是否自行编写方括号子集代码无关。


修复步骤与可运行代码

  1. 先修改输入fasta文件的序列名,统一使用纯字母、数字、下划线命名,删除空格、特殊符号,确保无重复序列名、无空序列
  2. 移除模型名称中的多余空格,调大迭代次数,按参数名规范传参
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:06:02