4

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

加载所需的包:尾错误:'rjags' 的包或命名空间加载失败:'rjags' 的 loadNamespace() 中的 .onLoad 失败,详细信息:调用:dyn.load(file, DLLpath = DLLpath, ...) 错误:无法加载共享对象'/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:未定义符号:_ZN4jags7Console10setRNGnameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEj 另外:警告消息:1:包 'rjags' 是在 R 版本 3.6.3 下构建的 2:包'coda' 是在 R 版本 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
4

1 回答 1

2

频道混合出错

我怀疑该错误是由于Conda Forge 和 Anaconda 软件包的混合造成的。这些组织使用不同的构建堆栈,因此他们构建的动态库最终可能具有不同的内部定义(有关详细信息,请参阅Conda Forge 存储库上的此问题)。例如,在这种情况下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。

首先,将环境导出到 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安装。

于 2020-06-25T02:14:05.290 回答