使用R的devtools::install时如何保留源文件?DESeq2源文件缺失求解
解答:DESeq2源码文件未出现在安装库目录的原因及调试方案
嘿,这其实是R包安装的常规行为,我来给你拆解清楚:
为什么安装后的库目录里找不到.R和.cpp文件?
当你从源码构建并安装R包时,R默认不会把原始源码文件复制到最终的库目录里:
- 对于
R/下的.R文件,R会将它们编译成二进制格式的.rdb和.rdx文件(存放在安装目录的Meta/子文件夹),这些编译后的文件加载速度更快,所以原始.R不会被保留在安装目录。 - 对于
src/下的.cpp文件,R会调用编译器(比如g++)把它们编译成平台相关的二进制库文件(CentOS上是.so文件),存放在安装目录的libs/子文件夹,原始的C++源码自然也不会被复制过去。
这种设计的核心目的是减小安装包的体积,同时提升包的加载效率。
你的原始源码文件在哪里?
它们还好好待在你当初用来构建包的源码目录里——就是你运行R CMD INSTALL或者devtools::install()命令时所在的那个DESeq2文件夹。比如你如果是从GitHub克隆的仓库,那DESeq2/R/和DESeq2/src/下面就保留着所有原始的.R和.cpp文件,不会因为安装操作而被移动或删除。
调试DESeq2的正确姿势
你不需要把源码文件放到安装库目录才能调试,正确的做法是直接在源码目录里工作:
- 打开R,切换工作目录到DESeq2源码根目录:
setwd("/path/to/your/DESeq2/source/folder") - 使用
devtools::load_all()函数加载整个包的源码:
这个命令会自动编译library(devtools) load_all()src/下的C++代码(如果有修改),并加载R/下的所有R函数,相当于在R会话中“临时安装”了源码版本的包,你可以直接修改源码后重新运行load_all()来测试。 - 调试细节:
- 针对R函数:用
debug(your_function)或者debugonce(your_function)设置断点,逐步执行代码。 - 针对C代码:如果你的环境安装了
gdb(CentOS上可以用yum install gdb安装),可以在RStudio中开启C调试功能,或者在终端用R -d gdb启动R来调试编译后的代码。
- 针对R函数:用
额外小技巧(不推荐常规使用)
如果你确实需要让安装后的包保留.R源码文件,可以在安装时加上--with-keep.source参数:
R CMD INSTALL --with-keep.source /path/to/DESeq2
这样安装目录的R/子文件夹会保留原始.R文件,但src/的.cpp文件仍然不会被复制,因为编译后的二进制库已经替代了它们的功能。
内容的提问来源于stack exchange,提问作者irritable_phd_syndrome




