在习惯了python后,使用R进行脚本开发会让人感到十分痛苦,老声长谈的错误回溯不明确问题暂且不谈,当要写的脚本稍微复杂点,需要分文件的时候,才发现R的导入机制也挺蛋疼的…. 还好有box包,可以用类似python的逻辑来进行模块化导入。
R中默认的导入方式
R中自带的导入方式有两种,source
和library
,前者本质是将指定R文件内的内容全部运行一遍,后者需要将代码打包成R包,安装后才能使用。
前者在要写的东西相对简单的时候还是比较好用的,但是一旦要实现的功能相对没那么简单,需要多拆几个文件时,就会出现问题了。
命名空间污染:
source()
会将脚本中的所有对象直接加载到当前环境,为防止冲突,需要额外配置。依赖关系不明确:如果脚本之间存在依赖关系,导入顺序错误会导致错误。
后续阅读代码进行维护难度大:从
source()
的部分,很难看出到底引入了什么,当想找来源代码进行修改时,需要一级一级回溯,非常麻烦。
如果使用library
, 每次都要打包非常麻烦不说,命名空间污染和找函数/对象来源的问题也是存在的。
总的来说,R自带的导入虽然能用,但是确实不好用…..
使用Box
Python 式模块化:支持 box::use() 语法实现类似 Python 的模块导入机制,使用方式见下:
1 | box::use( |
这种导入方式跟Python类似的地方在于,它一可以导入一个R文件中的特定内容,而不用全部引入,同时,它也可以想Python一样导入整个文件的内容到一个对象,然后通过mod$func()
这样的方式来调用对象中的函数,实现python中使用对象内方法一样的使用方式。
除了上面的优势,使用box
还可以实现相对路径解析,自动识别项目根目录,替代避免使用setwd()
不停切换目录,这种使用方式也考虑了跨平台兼容,它可以自动统一处理 Windows/Linux/macOS 路径格式差异。
最后,使用box
,也能解决导入时的溯源问题,不论是使用mod$func()
还是ggplot2[ggplot, aes]
这样的部分导入,都能一眼看出来使用函数/对象的来源,避免在一堆文件中翻来翻去。