R包异常行为:devtools::load_all加载后提示找不到内部函数
问题原因
- 并行环境隔离:
DTL_similarity_search_results_fast函数使用了future::plan(future::multisession)启用多会话并行,multisession模式会启动完全独立的后台R子进程,这些子进程默认不会继承主进程中devtools::load_all()加载的未安装包的函数环境,也不会自动加载你正在开发的本地包。 - 串行函数正常的逻辑:
DTL_similarity_search_results使用串行for循环执行,所有逻辑都在已经加载了包内全部函数的主进程中运行,所以可以正常调用内部的DTL_similarity_search函数。
解决方案
你可以根据使用场景任选以下一种方法修复:
- 方法1:显式给子进程传递依赖的包/函数
调用furrr::future_map_dfr时添加.packages参数传入你的包名,让子进程主动加载对应的包,同时如果包还未正式安装到本地R库,可以补充.export参数显式导出需要用到的内部函数:results <- furrr::future_map_dfr(search_patterns, function(pattern){ # 原有函数逻辑保持不变 print('DTL_similarity_search2') search_id <- DTL_similarity_search(pattern, transformation, database_names, metadata_filters, filter_category, minimum_similarity, max_edit_distance = max_edit_distance, max_length_difference = max_length_difference) if(is.null(search_id)){ return(tibble::tibble()) } ret <- DTL_get_results(search_id) if(!is.null(ret) && nrow(ret) > 0 )ret$search_pattern <- pattern ret }, .packages = "你的R包名称", .export = c("DTL_similarity_search", "DTL_get_results", "pattern_to_vec", "messagef")) - 方法2:更换并行模式(仅支持非Windows系统)
将future::plan(future::multisession)修改为future::plan(future::multicore),multicore模式通过fork主进程环境实现并行,子进程会直接继承主进程中load_all加载的所有函数,不需要额外配置。 - 方法3:显式调用包内函数
首先在包的NAMESPACE文件中导出DTL_similarity_search、DTL_get_results等需要在并行逻辑中调用的函数,之后将并行代码中的函数调用改为你的包名::DTL_similarity_search的显式调用形式,同时在.packages参数中添加你的包名即可。
另外注意代码中存在purrr:::调用非导出函数的写法,建议替换为purrr的公共函数调用,避免子进程调用报错。
内容的提问来源于stack exchange,提问作者eartoolbox
相关产品推荐
相关产品推荐

