使用 conda 安装 R 及依赖
1. 为什么我推荐用 conda 装 R?
很多人装 R 喜欢直接去官网下载二进制包,或者用系统包管理器(yum/apt)。但做生信的人都知道——R 的依赖链特别长,尤其装 BiocManager、DESeq2 这类包时,底层需要 libxml2、gdal、proj 等 C 库,版本稍微不对就报错。
用 conda 的好处说白了就一句:环境独立,依赖可控。我把 R 和它的所有包塞进一个环境里,跟系统里的 Python、Perl 完全不打架。我自己的服务器上曾经因为系统 glibc 版本太老,官方 R 装不上,conda 直接帮我拉了一个兼容的构建,省了大半天。
2. 第一步:安装 r-base
命令很简单,但有个坑:不要装最新版,要装稳定版。比如我们现在做 DESeq2 和 edgeR,R 4.2.x 或 4.3.x 最稳。直接跑:
conda install r-base=4.2.3 -c conda-forge
注意这里指定了 -c conda-forge。我个人习惯把 conda-forge 放在默认 channel 的最前面,因为它的生物信息学包维护得最好。如果你没加这个参数,默认从 defaults 装,版本可能落后半年以上。
3. 依赖冲突——这部分最头疼
装 r-base 本身一般不冲突,但如果你当前的 conda 环境里已经有 Python 3.12、gcc 12 之类的,conda 会试图统一所有包的版本……然后告诉你一堆“unsatisfiable error”。
为什么冲突? 因为 r-base 对 libstdcxx、libgcc-ng 有严格的版本要求。比如你的环境里 Python 3.12 依赖 libstdcxx >=12,而 conda-forge 的 r-base 4.2.3 只兼容 libstdcxx 9~11,两方互不相让。
解决冲突的三种实用方法
| 方法 | 适用场景 | 命令/操作 |
|---|---|---|
| 1. 新建干净环境 | 环境内包很多、冲突严重时 | |
| 2. 降级冲突包 | 只有一个两个包冲突时 | 用 conda install 指定版本,比如 conda install libstdcxx-ng=11 |
| 3. 使用 mamba 加速 | 依赖解析太慢时 | |
冲突日志怎么看?
当 conda 报错时,别被那几十行吓住。直接找冲突链的关键词:
The following packages are incompatible
├─ r-base 4.2.3 requires libstdcxx-ng >=9,<12
└─ pin-1 requires libstdcxx-ng >=12
看到这种信息,你就知道是 libstdcxx-ng 的版本上限被 r-base 卡死了,而另一个包非要 >=12。选择很简单:要么让另一个包用低版本,要么分开。
4. 验证 R 安装是否成功
装完后,先跑个命令看看版本:
conda activate r_env
R --version
你应该看到类似这样的输出:
R version 4.2.3 (2023-03-15) -- "Shortstop Beagle"
Copyright (C) 2023 The R Foundation for Statistical Computing
Platform: x86_64-conda-linux-gnu (64-bit)
看到绿色字体里的版本号了吗?要确认是 conda 版本,不是系统预装的 R。怎么判断?看 Platform 后面有没有 conda 字样,或者用 which R 看看路径。
R
> sessionInfo()
如果出现 Error: package or namespace load failed,说明有核心包(比如 stats, utils)没装上。这种情况我在 conda 里只遇到过一次——是缺 _r-mutex 包,重装 r-base 并指定 _r-mutex 1 anacondar_1 就解决了。
5. 核心逻辑图:R 安装与依赖冲突解决流程
下面这张图概括了从创建环境到验证的整个决策树,碰到冲突怎么选择分支——
6. 避坑总结
- 先看报错首行——"UnsatisfiableError" 后面跟着的包名就是矛盾核心。别翻到下面去看几十行的版本列表,没用。
- 别用 sudo——conda 是用户级安装,加 sudo 会污染系统路径,而且会丢失环境隔离。
- 验证时记得检查
which R——如果显示/usr/bin/R而不是/path/to/conda/envs/r_env/bin/R,说明你没有激活正确环境,或者 PATH 优先度不对。我遇到过两次,都是因为忘记conda activate就直接敲了 R。 - 依赖冲突时,先试试
mamba——它的求解器快 5 倍以上,而且有时候 conda 解不出来的冲突,mamba 换个顺序就解了。安装 mamba 就一行:conda install mamba -c conda-forge。