使用SSDM包运行堆叠物种分布模型时遇sort.list(y)错误求助
解决SSDM包
load_occ函数中的sort.list报错:'x' must be atomic for 'sort.list' 从你的错误栈信息来看,问题出在load_occ函数将物种列转换为因子类型的过程中:
Occurrences loading Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?
Calls: load_occ -> as.factor -> as.factor -> factor -> sort.list
sort.list()只能处理原子类型(比如字符、数值向量),不能处理列表(list)类型。这说明你的物种列(species)在被读入后是列表类型,而非标准的字符/因子向量,导致as.factor()调用失败。
下面是具体的排查和解决步骤:
1. 检查并修复物种列的数据类型
先手动读取你的分布点文件,查看species列的类型:
# 单独读取CSV文件 occ_raw <- read.csv("Final_African_bird_occurrence_rarefied_points.csv", sep = ",") # 查看species列的结构 str(occ_raw$species)
如果输出显示为List of ...,说明该列确实是列表类型(可能是CSV文件中物种名称包含特殊格式,比如换行、嵌套值,导致read.csv误读为列表)。你可以将其转换为原子向量:
# 将列表转换为字符向量 occ_raw$species <- unlist(occ_raw$species) # 可选:提前转换为因子(也可以让load_occ自动处理) occ_raw$species <- as.factor(occ_raw$species) # 保存修复后的文件(可选,方便后续直接调用) write.csv(occ_raw, "Fixed_African_bird_occurrence_rarefied_points.csv", row.names = FALSE)
之后用修复后的文件重新调用load_occ即可。
2. 检查stack_modelling的参数错误
除了当前的报错,你的stack_modelling代码里有两个明显的参数错误,建议提前修正,避免后续出现问题:
Xcol = "Xcol", Ycol = "Xcol":这两个参数应该对应Occurrences数据框中的坐标列名。根据load_occ的输出规则,坐标列会被重命名为X和Y,所以应该改为Xcol = "X", Ycol = "Y"。Spcol = "Spcol":该参数需要指定Occurrences中的物种列名,也就是你在load_occ中设置的species,所以应该改为Spcol = "species"。
3. 验证子集数据的物种列
你提到用数据子集也会出现相同错误,说明即便是子集里的物种列依然存在非原子类型的问题。按照步骤1的方法检查子集的species列,确认修复后再测试。
内容的提问来源于stack exchange,提问作者Nikhail Arumoogum
相关产品推荐
相关产品推荐

