不使用RStudio时R语言here包的最佳实践问询
关于R语言here包非RStudio环境下的使用问题解答
你的项目结构
project_dir | |___ data_dir | |___ scripts_dir
问题1:非RStudio环境下的最佳实践,以及脚本1、2、3的区别
非RStudio环境下,here包的核心需求是让它精准定位到project_dir作为根目录,推荐两种最佳实践:
- 在
project_dir下创建一个空的.here文件(无内容也可),作为根目录的标记; - 在脚本开头用
here::i_am()明确指定当前脚本相对于根目录的路径,强制锁定根目录。
脚本1、2、3本质上没有核心区别:
- 三者都是依赖here包的自动根目录检测逻辑:第一次调用
here()(不管是直接调用here(),还是用here()拼接文件路径,甚至是here::here())时,here会从当前工作目录向上遍历,寻找包含.here、版本控制目录(如.git)或RStudio项目文件的目录作为根。 - 差异仅在于触发检测的时机:脚本1先调用
here()触发检测,脚本2在读取文件时触发,脚本3先通过here::here()(不加载包直接调用命名空间函数)触发检测,之后再加载包。但只要here能找到根目录的标记(比如.here或.git),三者的运行效果完全一致。 - 你遇到的
source时需要.here文件的情况,是因为source脚本时工作目录是scripts_dir,此时向上遍历如果没有标记文件,here就会把scripts_dir当作根,导致找不到data_dir;而用Rscript运行时可能你是从project_dir启动的脚本(比如Rscript scripts_dir/script1.R),此时工作目录是project_dir,here直接把它当作根,所以不需要.here也能运行。
问题2:.here文件的作用及是否必需
.here文件是here包识别项目根目录的通用锚点标记:here包启动时,会从当前路径向上逐层查找,第一个包含.here文件的目录会被认定为项目根。- 不是必须的:如果你的
project_dir里已经有版本控制目录(如.git、.svn)、RStudio项目文件(.Rproj),here会自动识别这些标记,不需要额外创建.here。 - 什么时候需要?当你没有上述标记,且需要在子目录(比如
scripts_dir)下直接运行/source脚本时,.here文件是最可靠的根目录标记,能确保here定位到上层的project_dir。
问题3:i_am()的作用及你的使用误区
i_am()的核心作用是手动锁定项目根目录:通过指定当前脚本相对于根目录的路径,强制here将该脚本所在目录的上层对应路径设为根,不需要依赖任何自动检测的标记文件(如.here、.git)。- 你的使用误区是路径写错了:示例里的
here::i_am("src/load.r")是对应脚本在src目录的情况,而你的脚本在scripts_dir下,应该写成here::i_am("scripts_dir/[你的脚本文件名].r")(比如脚本是scripts_dir/script4.R,就写here::i_am("scripts_dir/script4.R"))。 - 适用场景:当你不想创建
.here文件,或者项目结构特殊导致自动检测失效时,用i_am()可以精准锁定根目录,不管你从哪个目录运行脚本都能生效。
内容的提问来源于stack exchange,提问作者point618
相关产品推荐
相关产品推荐

