To make box::file()
返回当前脚本的目录路径而不是当前工作目录,您需要加载脚本作为一个模块。最基本的是,这意味着替换source
来电 来电box::use
。原因是‘盒子’提供了一个模块系统而不是单独的辅助函数;因此,box::file
等等。假设它们是在模块的上下文中调用的。这“盒子”包装插图 https://klmr.me/box/articles/box.html提供了进一步的信息。
作为使用示例,使用“box”模块,您的Launch.R
脚本如下所示:
box::use(
./assumptions[...],
./project_env[...],
./assumptions[...],
./selected_assumptions[...],
./output[...],
./run_scenarios[...],
)
Where:
- 模块名称不带引号
-
./…
表示这是本地的,relative模块名称(而不是包或全局安装的模块,其搜索方式不同)
-
[...]
意思是:附加模块内部定义的所有名称;默认情况下,“box”在加载模块时不附加导出。默认情况下不进行附加,因为通常不建议这样做。
另请注意,每个模块都有自己的作用域,就像 R 包一样。因此,声明project_env$launch_mode = project_env$scenario_toggle$DEFAULT
对加载的模块没有影响。要使模块在调用代码中看到变量,您需要显式传递它们into该模块。
通过这些变化,box::file()
在模块之一内调用将返回该模块目录的路径;和box::file('some_file')
将返回绝对路径some_file
嵌套在模块内部(同样,有关更多详细信息,请参阅上面链接的小插图)。
最后,执行Launch.R
在您的项目之外,通过上述更改,您可以简单地运行例如Rscript path/to/Launch.R
这会起作用的。或者,您也可以治疗Launch.R
作为模块并通过加载它box::use
。要从项目外部执行此操作,您需要配置‘box’搜索路径 https://klmr.me/box/reference/use.html#search-path通过box.path
选项。之后,您可以通过以下方式使用该模块absoluteimport 指令(与之前的 local 相比,relative导入指令):
box::use(projectname/Launch)
-
projectname
这里是包含您的文件夹的文件夹名称Launch.R
脚本,以及box.path
选项需要包含其路径父目录.