抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

在习惯了python后,使用R进行脚本开发会让人感到十分痛苦,老声长谈的错误回溯不明确问题暂且不谈,当要写的脚本稍微复杂点,需要分文件的时候,才发现R的导入机制也挺蛋疼的…. 还好有box包,可以用类似python的逻辑来进行模块化导入。

R中默认的导入方式

R中自带的导入方式有两种,sourcelibrary,前者本质是将指定R文件内的内容全部运行一遍,后者需要将代码打包成R包,安装后才能使用。

前者在要写的东西相对简单的时候还是比较好用的,但是一旦要实现的功能相对没那么简单,需要多拆几个文件时,就会出现问题了。

  1. 命名空间污染:source()会将脚本中的所有对象直接加载到当前环境,为防止冲突,需要额外配置。

  2. 依赖关系不明确:如果脚本之间存在依赖关系,导入顺序错误会导致错误。

  3. 后续阅读代码进行维护难度大:从source()的部分,很难看出到底引入了什么,当想找来源代码进行修改时,需要一级一级回溯,非常麻烦。

如果使用library, 每次都要打包非常麻烦不说,命名空间污染和找函数/对象来源的问题也是存在的。

总的来说,R自带的导入虽然能用,但是确实不好用…..

使用Box

Python 式模块化:支持 box::use() 语法实现类似 Python 的模块导入机制,使用方式见下:

1
2
3
4
5
box::use(
plots = ./modules/plot_functions, # 根据路径导入./modules/plot_functions.R文件
shiny_utils = shiny/utils, # 导入文件,并进行对象重命名
ggplot2[ggplot, aes] # 导入ggplot2中的ggplot和aes
)

这种导入方式跟Python类似的地方在于,它一可以导入一个R文件中的特定内容,而不用全部引入,同时,它也可以想Python一样导入整个文件的内容到一个对象,然后通过mod$func()这样的方式来调用对象中的函数,实现python中使用对象内方法一样的使用方式。

除了上面的优势,使用box还可以实现相对路径解析,自动识别项目根目录,替代避免使用setwd()不停切换目录,这种使用方式也考虑了跨平台兼容,它可以自动统一处理 Windows/Linux/macOS 路径格式差异。

最后,使用box,也能解决导入时的溯源问题,不论是使用mod$func()还是ggplot2[ggplot, aes]这样的部分导入,都能一眼看出来使用函数/对象的来源,避免在一堆文件中翻来翻去。

评论

留下友善的评论吧~