如何使用R包box重新加载本地自定义模块?
使用R包
box重新加载本地模块的问题解决 问题背景
环境设置
先开发helper.R函数:
# helper.R helper <- function(i) { return(paste("help", i)) }
随后在wrapper.R中调用该函数:
# wrapper.R box::use(./helper[helper]) lapply(1:3, helper)
运行结果符合预期:
r$> lapply(1:3, helper) [[1]] [1] "help 1" [[2]] [1] "help 2" [[3]] [1] "help 3"
问题描述
不重启R会话的前提下修改helper.R:
# helper.R helper <- function(i) { return(paste("Please help", i)) }
尝试用box::reload(./helper[helper])或box::reload("helper")加载更新后的函数时,出现错误:
"reload" expects a module object, got "helper", which is not a module alias variable
核心误解在于:box::reload()需要的是模块对象,而非box::name()返回的模块名称字符串或单个导出函数。
解决方法
方法1:导入时保留模块对象引用
修改wrapper.R的导入逻辑,直接导入整个模块并保留别名:
# wrapper.R box::use(./helper) # 调用函数 lapply(1:3, helper$helper)
修改helper.R后,直接调用reload传入模块对象即可:
box::reload(helper) # 再次调用会使用更新后的函数 lapply(1:3, helper$helper)
方法2:已导入单个函数时的补救方案
如果已经只导入了单个函数,可重新导入整个模块并更新函数引用:
# 导入整个模块到临时对象 helper_mod <- box::use(./helper) # 重新加载模块 box::reload(helper_mod) # 更新本地的helper函数 helper <- helper_mod$helper # 验证更新 lapply(1:3, helper)
关键说明
box::reload()的参数必须是模块对象(即box::use导入的模块别名),而非模块名称字符串或单个导出函数。box::name()返回的是模块的名称标识,并非可直接传入reload的对象。
内容的提问来源于stack exchange,提问作者Daniel M Bader
相关产品推荐
相关产品推荐

