为何单独运行函数代码行正常,整函数运行却报错?
问题:R函数调用时出现"object 'census_info' not found"错误
我编写了一个脚本,通过多个函数将不同国家的数据集标准化为统一格式。批量运行代码时出现错误,但单独执行FormatTMtCensusData函数内的代码后,再运行主函数就能正常工作。
主脚本代码
machine <- ajs database.code <- "NOR" #1. 导入数据集——此部分运行无问题 orig.data.list <- LoadTMtOriData (database.code, machine = machine, team.qc = F) #2. 转换数据格式 tmt.data.list <- Conver2TMtData (orig.data.list, database.code = database.code, machine = machine)
报错信息
Error in FormatTMtCensusData(tree = tree_test, database.code = "NOR") : object 'census_info' not found
Conver2TMtData函数代码
Conver2TMtData <- function (orig.data.list, database.code, machine) { td1 <- orig.data.list [[1]]; spp1 <- orig.data.list [[2]]; if (database.code == 'NOR') { tree <- FormatTMtTreeData (td = td1, spp = spp1, md = md1, database.code = 'NOR') write.csv(tree, "/Users/ajdinstarcevic/OneDrive - University of Eastern Finland/UEF/WUR/WORK/Mortality model/Data/NOR/tree.csv") spp <- FormatTMtSppData (tree, database.code = 'NOR') tree_test <- tree census_info <- FormatTMtCensusData (tree=tree_test, database.code = 'NOR') } }
FormatTMtCensusData函数代码
FormatTMtCensusData <- function (tree, database.code) { if (database.code == 'NOR') { census_info <- unique (tree[,c('database.code','tmt.census.id','census.id', 'census.date','census.n','tmt.plot.id','plot.id')]) census_info$census.contact <- 'NA' census_info$census.contact.email <- 'NA' } }
问题原因
FormatTMtCensusData函数内部创建了census_info对象,但没有返回该对象。批量运行时,函数执行完毕后内部环境销毁,census_info不会传递给调用它的Conver2TMtData函数;而单独运行函数内的代码时,census_info会被创建在全局环境中,后续调用Conver2TMtData时能读取到这个全局变量,因此不会报错。
解决方案
修改FormatTMtCensusData函数,确保它返回census_info对象。有两种方式:
- 在函数末尾添加
return(census_info):
FormatTMtCensusData <- function (tree, database.code) { if (database.code == 'NOR') { census_info <- unique (tree[,c('database.code','tmt.census.id','census.id', 'census.date','census.n','tmt.plot.id','plot.id')]) census_info$census.contact <- 'NA' census_info$census.contact.email <- 'NA' } return(census_info) }
- 直接将
census_info作为函数的最后一行(R函数默认返回最后一行的结果):
FormatTMtCensusData <- function (tree, database.code) { if (database.code == 'NOR') { census_info <- unique (tree[,c('database.code','tmt.census.id','census.id', 'census.date','census.n','tmt.plot.id','plot.id')]) census_info$census.contact <- 'NA' census_info$census.contact.email <- 'NA' } census_info }
同时建议处理database.code不为'NOR'的情况,避免返回NULL导致后续出错,比如可以添加默认返回值:
FormatTMtCensusData <- function (tree, database.code) { census_info <- NULL if (database.code == 'NOR') { census_info <- unique (tree[,c('database.code','tmt.census.id','census.id', 'census.date','census.n','tmt.plot.id','plot.id')]) census_info$census.contact <- 'NA' census_info$census.contact.email <- 'NA' } census_info }
内容的提问来源于stack exchange,提问作者starski
相关产品推荐
相关产品推荐

