R中carrier::crate封装函数无法识别import_env2中函数的原因求解
原因说明与修复方案
import_env2函数无法识别的核心原因
你向carrier::crate传递额外函数的方式存在逻辑错误:
- 构造
extra_functions_to_declare时你用了表达式rlang::expr(import_env2[[!!x]]),这个表达式本质是对当前会话下import_env2环境对象的引用,而carrier::crate只会打包你显式传入的参数值,不会自动捕获import_env2这个环境本身。 - 在新环境加载保存的
fun时,原会话的import_env2已经不存在,表达式求值时找不到对应的环境,自然无法获取enquos等函数。
其他关联问题说明
你加载时看到的一系列命名空间不存在的警告,以及后续可能出现的其他依赖报错,是因为当前打包逻辑存在多处依赖引用问题:
- 用
rlang::set_env(!!rlang::sym(x))处理styler内置函数时,这些函数仍保留了原styler命名空间的调用逻辑,内部依赖查找默认还是会访问原包命名空间,不会自动切换到crate的封闭环境。 - 大量原包的层级依赖没有被显式打包到crate环境中,运行时自然会找不到对应函数。
修复方法
首先解决import_env2的函数识别问题:不要引用环境对象,直接把函数本身作为值传入crate即可:
# 替换原来的extra_functions_to_declare构造逻辑 extra_functions_to_declare <- as.list(import_env2)
这样你用!!!extra_functions_to_declare传入crate时,enquos、quo_invert会作为独立的函数对象被打包到crate的封闭环境中,新环境加载时就可以直接找到。
如果要实现完全无依赖的打包,你还需要修改所有包函数的封闭环境,统一指向crate的运行环境,并且确保所有层级的依赖都被显式纳入打包范围,不要保留原包的命名空间引用。
内容的提问来源于stack exchange,提问作者Hiski
相关产品推荐
相关产品推荐

