无法加载共享对象 'TMB.so'

unable to load shared object 'TMB.so'

我通过 conda conda install -c conda-forge r-broom.mixed 安装了 broom.mixed 包,但是它没有导入并显示错误消息:

library(broom.mixed)

Error: package or namespace load failed for ‘broom.mixed’:
 .onLoad failed in loadNamespace() for 'TMB', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared object '/local/home/hsinhung/anaconda3/envs/r-env/lib/R/library/TMB/libs/TMB.so':
  libopenblas.so.0: cannot open shared object file: No such file or directory

2022/1/17 添加了“希望”可重现的示例:

我通过以下命令在 Anaconda 中创建了一个干净的 R 环境:

conda create -n r_env_test r-essentials r-base(继 Anaconda R env instruction

conda activate r_env_test

conda install -c conda-forge r-broom.mixed(继 Anaconda broom.mixed instruction

然后我进入R控制台,然后执行library(broom.mixed)。错误立即弹出:

> library(broom.mixed)
Error: package or namespace load failed for ‘broom.mixed’:
 .onLoad failed in loadNamespace() for 'TMB', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared object '/local/home/hsinhung/anaconda3/envs/r_env_test/lib/R/library/TMB/libs/TMB.so':
  libopenblas.so.0: cannot open shared object file: No such file or directory
In addition: Warning message:
package ‘broom.mixed’ was built under R version 3.6.3

正如@merv 所建议的,这里是新测试环境中包版本的输出:

x86_64-conda_cos6-linux-gnu % conda list '(libblas|liblapack|r-base|r-tmb|r-broom.mixed)'
# packages in environment at /home/hsinhung/anaconda3/envs/r_env_test:
#
# Name                    Version                   Build  Channel
r-base                    3.6.1                haffb61f_2
r-base64enc               0.1_3             r36h96ca727_4
r-broom.mixed             0.2.6             r36h6115d3f_0    conda-forge
r-tmb                     1.7.16            r36h0357c0b_0    conda-forge
(r_env_test)
(22-01-17 8:16:12) <0> [~]
x86_64-conda_cos6-linux-gnu %

有什么建议可以让这个包在 Anaconda 中运行吗?

频道混合不当

我认为遇到的问题主要是由于混合了 defaults 频道(特别是 r 频道)和 conda-forge 频道。这是 known to lead to missing libraries and missing symbol references in shared libraries 因为 Anaconda 和 Conda Forge 使用不同的构建堆栈,有时使用不同的配方。

在这种情况下,r-broom.mixed 取决于 r-tmb,而在 Conda Forge 上则取决于 libblasliblapack,但取决于 r 频道没有这些依赖项。

推荐:仅限 Conda Forge

一般来说,我建议想要 R 环境的 Conda 用户只使用 Conda Forge,避免使用 r 频道。这是因为据我所知,r 频道大部分已被放弃(例如,没有 R 版本 4 发布,并且大多数软件包已经一年多没有更新)。

此外,我不鼓励使用 r-essentials 包。类似于 Python(anaconda 包)的 Anaconda 发行版,r-essentials 包将许多预计将由数据科学家使用的包捆绑在一起,但其中一些对我来说似乎很臃肿.令我烦恼的是,除了 R 之外,它最终还引入了 Python。没有人需要将 Python 与 R 环境混合。这是由于包含 notebook,如果用户真的想加载 R 环境作为内核,他们只需要 r-irkernel(如下所示)。

总而言之,只需执行以下操作就可以了:

conda create -n foo -c conda-forge r-base r-broom.mixed

示范[​​=45=]

为了验证 BLAS 实现没有影响,我使用 MKL 和 OpenBLAS 进行了测试。

我在使用以下设置时没有遇到任何问题:

## dedicated jupyter environment
mamba create -n jupyter jupyter nb_conda_kernels

## broom.mixed with MKL backend
mamba create -n broom_mkl r-base=4.1 r-broom.mixed r-irkernel 'blas=*=*mkl*'

## broom.mixed with OpenBLAS backend
mamba create -n broom_openblas r-base=4.1 r-broom.mixed r-irkernel 'blas=*=*openblas*'

## launch jupyter
conda activate jupyter
jupyter notebook

随着 Jupyter 的启动,我可以使用 broom_mklbroom_openblas 内核创建一个新笔记本,并且 运行 library(broom.mixed) 加载时不会出现任何错误。

这是在osx-64平台上。