求助:在R中调用BIEN数据库获取含特殊字符的物种数据失败
解决BIEN包加载带特殊字符物种数据的问题
错误原因分析
你遇到的Arguments imply different number of rows: 0, 1错误,本质是指定物种在当前筛选条件下没有返回任何记录:BIEN_occurrence_species返回了0行的空数据框,此时occ$scrubbed_species_binomial等向量长度为0,但dataset = "BIEN"是长度1的向量,两者无法组成data.frame。
分步解决方案
1. 确认物种在BIEN库中是否存在有效记录
用BIEN_taxonomy_species验证物种名称是否匹配BIEN的分类系统,同时查看是否有相关记录:
library(BIEN) # 验证TNRS修正后的物种名称 tax_results <- BIEN_taxonomy_species( species = c("Abies x borisii-regis", "Abies nordmanniana subsp. equi-trojani", "Abies bornmuelleriana") ) print(tax_results)
如果返回空数据框,说明BIEN库中本身没有该物种的记录,或者名称匹配失败;如果有结果,再进一步检查筛选条件。
2. 调整筛选条件,排查过滤导致的无数据
你的代码中设置了cultivated = FALSE和natives.only = TRUE,这两个条件会过滤掉栽培种和非本土记录,可能导致无数据返回。尝试放宽条件测试:
# 测试放宽筛选后的结果 occ_test <- BIEN_occurrence_species( species = c("Abies x borisii-regis"), cultivated = TRUE, # 包含栽培记录 natives.only = FALSE, # 包含非本土记录 collection.info = FALSE, all.taxonomy = TRUE ) cat("返回记录行数:", nrow(occ_test), "\n")
如果这里有数据,说明原筛选条件过于严格,可根据需求调整参数。
3. 添加空数据判断,避免构建data.frame时报错
无论是否获取到数据,先判断记录行数再构建结果数据框,防止报错:
occ <- BIEN_occurrence_species( species = c("Abies x borisii-regis"), cultivated = FALSE, natives.only = TRUE, collection.info = FALSE, all.taxonomy = TRUE ) # 处理空数据情况 if (nrow(occ) > 0) { ccdf <- data.frame( species = occ$scrubbed_species_binomial, decimalLongitude = occ$longitude, decimalLatitude = occ$latitude, dataset = "BIEN", stringsAsFactors = FALSE ) } else { # 创建结构一致的空数据框 ccdf <- data.frame( species = character(), decimalLongitude = numeric(), decimalLatitude = numeric(), dataset = character(), stringsAsFactors = FALSE ) warning("未找到指定物种的分布记录") }
4. 特殊字符说明
BIEN的函数原生支持带-和x(杂交种标记)的物种名称,不需要额外转义或特殊格式处理,名称本身不是问题核心,重点是物种是否在库中有匹配记录,以及筛选条件是否合理。
内容的提问来源于stack exchange,提问作者user23632192
相关产品推荐
相关产品推荐

