如何在打印已安装R包函数时保留原始代码格式与注释
R包内函数打印丢失原始格式与注释的解决方法
问题核心原因
全局工作空间直接运行脚本定义的函数,会自动携带srcref(源码引用)属性,存储了编写时的原始排版、注释内容,打印时直接读取该属性输出,所以和编写时的样式完全一致。
而用默认参数安装R包时,安装流程会对函数做字节编译、精简存储,默认丢弃srcref属性,打印时只能输出解析后的函数语法结构,不仅会自动重排缩进、删除所有注释,还会额外显示字节码地址、包命名空间环境信息,可读性很差。
可用解决方法(个人自用场景)
1. 安装自用包时开启源码保留,实现和全局环境完全一致的打印效果
用devtools安装个人开发的包时,添加对应参数关闭编译、保留源码引用即可,安装命令参考:
# 将pkg参数替换为你本地的R包目录路径 devtools::install( pkg = "本地包路径", build = FALSE, # 跳过R CMD build打包流程,避免源码被预处理 compile = FALSE, # 关闭字节编译 keep_source = TRUE # 强制保留函数的srcref源码属性 )
安装完成后再打印包内函数,输出效果就和全局环境定义的函数完全一致,原始缩进、注释都会完整保留。如果之前已经安装过同名包,建议先执行remove.packages("包名")卸载旧版本再安装,避免缓存导致参数不生效。
2. 直接读取包原始源文件查看
如果不想重新安装包,可以直接定位到包的安装目录查看原始源码:
- 运行
.libPaths()查看R的包存储路径 - 进入对应包名的文件夹,打开
R子目录下的源文件,就能看到编写时的完整原始代码,格式、注释不会有任何改动。也可以直接调用file.show()在R内打开对应文件查看。
补充说明
公开发布到CRAN的R包默认都会关闭源码保留、开启字节编译,主要是为了压缩包体积、加快函数加载速度。个人自用包开启源码保留带来的性能影响几乎感知不到,不影响正常使用。
内容的提问来源于stack exchange,提问作者Henrik Renlund
相关产品推荐
相关产品推荐

