Error: package or namespace load failed for 'rjags'

Error: package or namespace load failed for 'rjags'

在终端的一个 conda 环境中,我能够成功安装包 'rjags'。但是,当我在该环境中 运行 R 和 运行 library(rjags) 时,出现以下错误:

Loading required package: coda Error: package or namespace load failed for 'rjags': .onLoad failed in loadNamespace() for 'rjags', details: call: dyn.load(file, DLLpath = DLLpath, ...) error: unable to load shared object '/user-path/anaconda3/envs/r-env/lib/R/library/rjags/libs/rjags.so': /user-path/anaconda3/envs/r-env/lib/R/library/rjags/libs/rjags.so: undefined symbol: _ZN4jags7Console10setRNGnameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEj In addition: Warning messages: 1: package 'rjags' was built under R version 3.6.3 2: package 'coda' was built under R version 3.6.3

如果我安装并使用 R,在另一个环境或基础环境中执行 library(rjags),一切正常。我想知道这条错误消息是什么意思以及如何解决它。

conda list "^(libstdcxx-ng|r-base|r-coda|jags|r-rjags)$"的输出是:

# packages in environment at /user-path/anaconda3/envs/r-env:
#
# Name                    Version                   Build  Channel
jags                      4.3.0                h26a2512_0    conda-forge
libstdcxx-ng              9.1.0                hdf63c60_0  
r-base                    3.6.1                h9bb98a2_1  
r-coda                    0.19_3            r36h6115d3f_2    conda-forge
r-rjags                   4_10              r36h0357c0b_1    conda-forge

频道混合出错

我怀疑错误是由于mixing of Conda Forge and Anaconda packages. The organizations use different build stacks and so the dynamic libraries they build can end up having different internal definitions (for details, see this Issue on the Conda Forge repository)。例如,在这种情况下 rjags.so 被构建为在它链接到的库中查找符号,但它无法在 Anaconda 构建中找到它。不幸的是,它链接到太多(检查 ldd rjags.so),我无法找出具体导致问题的原因。

但是,您仍然有一些选项可以让 rjags 正常工作,只是不是精确修复。在所有情况下,解决方案是优先考虑 conda-forge 通道

选项 1:创建新的专用环境

如果您实际上不需要 rjags 在此特定环境中,请使用您需要的包创建一个新环境。但是,这样做时,使 conda-forge 优先于 defaults:

conda create -n rjags_env -c conda-forge r-rjags
conda activate rjags_env
conda config --env --add channels conda-forge

选项 2:使用 Conda Forge 重新创建环境

如果您的目标是将 rjags 添加到现有的 env,并且您无法确定需要更改的特定包,则可以使用更新后的优先级重新创建 env。

首先,将 env 导出到类似

的 YAML
conda env export -n r-env --no-builds > rjags_env.yaml

接下来,编辑此文件,使频道部分显示为:

name: rjags_env
channels:
  - conda-forge
  - defaults
dependencies:

最后用

创建一个新版本的环境
conda env create -f rjags_env.yaml -n rjags_env

补充说明

我也研究过将 --update-deps 标志与 conda install 一起使用,但这会强制环境更新到 R v4.0.1 并破坏 r-coda 安装。