错误:“rjags”的包或命名空间加载失败

Posted

技术标签:

【中文标题】错误:“rjags”的包或命名空间加载失败【英文标题】:Error: package or namespace load failed for 'rjags' 【发布时间】:2020-10-13 00:57:45 【问题描述】:

在我的终端 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

【问题讨论】:

您能否在问题中添加一些有关 env 的详细信息?我认为以下输出将是其他人尝试复制该问题的最低要求:conda list "^(libcxx|r-base|r-coda|jags|r-jags)$" @merv 当然,我把输出放在上面 这是linux平台?如果是这样,请注意检查这个而不是我以前的设置:conda list "^(libstdcxx-ng|r-base|r-coda|jags|r-rjags)$" @merv 是的,这是 linux。我已更新上述内容以反映更改。 谢谢,这很有帮助,我能够重现错误。 【参考方案1】:

频道混合出错

我怀疑错误是由mixing of Conda Forge and Anaconda packages 引起的。这些组织使用不同的构建堆栈,因此他们构建的动态库最终可能具有不同的内部定义(有关详细信息,请参阅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 添加到现有环境中,并且您无法确定需要更改的特定包,则可以使用更新的优先级重新创建环境。

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

【讨论】:

谢谢!读完这篇文章后,我实际上能够通过将所有包更新到 conda-forge 频道来解决这个问题,这样就可以保持一致性。另外 - 在选项 1 下的代码块中,我相信“频道”应该是“频道”。 @merv @merryberry 太棒了 - 是的,我认为有一种方法可以做到这一点,但只是没有想到。很高兴你成功了! 这对我有用(选项 1)谢谢@merv

以上是关于错误:“rjags”的包或命名空间加载失败的主要内容,如果未能解决你的问题,请参考以下文章

在另一个命名空间中自动加载命名空间时出错

如何从另一个包中只导入一个函数,而不加载整个命名空间

作曲家自动加载命名空间错误

tmPlot在命名空间中,但找不到它的依赖项

Composer 生成大小写错误的命名空间

Zend Framework 1.11:如何自动加载使用命名空间的类