当我尝试安装需要libRblas.so
的某些软件包(imputeTS
)时,AFAIK指的是OpenBLAS,我得到一个没有找到的错误:
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/home/jay/R/x86_64-pc-linux-gnu-library/4.2/fracdiff/libs/fracdiff.so':
libRblas.so: cannot open shared object file: No such file or directory
Calls: <Anonymous> ... asNamespace -> loadNamespace -> library.dynam -> dyn.load
Execution halted
然而,sessionInfo()
表明,R实际上找到了它。
> sessionInfo()
R version 4.2.1 (2022-06-23)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 22.04 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so
我从这个帖子中学到"maybe…另一个版本的R(被构建),它位于……在打包版本">之前的$PATH,这很可能是这种情况;我以前的R版本4.2.0
是一个自编译的,我通过再次下载源代码和./configure
-make uninstall
来删除它。这个是通过sudo apt install r-base-core
安装的。现在可能有一个混乱的地方。不幸的是,引用的线程以不同的方式解决,我现在正在寻找各自的结论。
这里是一些更多的信息:
whereis R
给
~$ whereis R
R: /usr/bin/R /usr/lib/R /usr/lib64/R /etc/R /usr/local/lib/R /usr/share/R /usr/share/man/man1/R.1.gz
从错误消息的相应文件中,使用sudo find ~ -name '<file>'
,找到了fracdiff.so
,而libRblas.so
没有。
~/R/x86_64-pc-linux-gnu-library/4.2/fracdiff/libs/fracdiff.so
我已经试过了,
~$ sudo apt install libopenblas-dev
但显然已经安装了
libopenblas-dev is already the newest version (0.3.20+ds-1).
根据这个建议,libRlapack.so
和libRblas.so
显然不存在于我的系统中,而另一个建议只是给出:
~$ sudo update-alternatives --config libblas.so
update-alternatives: error: no alternatives for libblas.so
永远不应该有"需求";为libRblas.so
。简而言之,R允许您使用它提供的BLAS和LAPACK(子集)源进行构建,然后获得此libRblas.so
。或者你可以使用系统BLAS和LAPACK库,我负责的Debian(也就是Ubuntu)包可能已经做了将近20年了,它允许你切换BLAS安装(Atlas, OpenBLAS, MKL,以前也有Goto,…)。
作为演示,我刚刚基于r2u启动了一个合适的Ubuntu 22.04 Docker容器,因为它结合了R预制(使用我的r-base-core
包与外部BLAS链接)以及(太棒了!!)将所有的CRAN作为Ubuntu二进制文件的能力(更多信息请参阅r2u)。简而言之:
edd@rob:~$ docker run --rm -ti --security-opt seccomp=unconfined eddelbuettel/r2u:jammy
root@818091e49861:/# export PS1="root@r2u_docker:w# "
root@r2u_docker:/# echo "192.168.1.114 dirk.eddelbuettel.com" >> /etc/hosts
root@r2u_docker:/# install.r imputeTS ## one command !!
Install system packages as root...
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Ign https://dirk.eddelbuettel.com/cranapt jammy InRelease
Hit https://dirk.eddelbuettel.com/cranapt jammy Release
Hit http://archive.ubuntu.com/ubuntu jammy InRelease
Hit http://archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit http://archive.ubuntu.com/ubuntu jammy-backports InRelease
Hit http://security.ubuntu.com/ubuntu jammy-security InRelease
Get:1 https://ppa.launchpadcontent.net/marutter/rrutter4.0/ubuntu jammy InRelease [17.5 kB]
Fetched 17.5 kB in 0s (0 B/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Get:1 https://dirk.eddelbuettel.com/cranapt jammy/main amd64 r-cran-bitops amd64 1.0-7-1.ca2204.1 [25.5 kB]
Get:2 https://dirk.eddelbuettel.com/cranapt jammy/main amd64 r-cran-glue amd64 1.6.2-1.ca2204.1 [143 kB]
[... cutting here to satisfy SO quote limit ...]
Setting up r-cran-forecast (8.16-1.ca2204.1) ...
Setting up r-cran-imputets (3.2-1.ca2204.1) ...
root@r2u_docker:/#
之后,我们确实可以启动R并加载它:
root@r2u_docker:/# R
R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid"
Copyright (C) 2022 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> library(imputeTS)
Registered S3 method overwritten by 'quantmod':
method from
as.zoo.data.frame zoo
>
使用外接BLAS/LAPACK "设计";
root@r2u_docker:/# dpkg -l | grep -i "blas|lapack" | cut -c-90
ii libblas-dev:amd64 3.10.0-2ubuntu1 amd64 Basi
ii libblas3:amd64 3.10.0-2ubuntu1 amd64 Basi
ii liblapack-dev:amd64 3.10.0-2ubuntu1 amd64 Libr
ii liblapack3:amd64 3.10.0-2ubuntu1 amd64 Libr
root@r2u_docker:/#
所以我认为这可能是自我强加的组合,你可能已经编译R本地加上imputeTS
不能很好地处理(它应该,它可能是一个bug)。但我希望这也表明,这也可以更容易。
如果您有更详细的后续问题,请来到r-sig-debian
列表,这是友好的,没有意义的,小批量的。
sessionInfo()
在一个新的会话中:
> sessionInfo()
R version 4.2.1 (2022-06-23)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 22.04 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices datasets utils methods base
loaded via a namespace (and not attached):
[1] compiler_4.2.1 bspm_0.3.9
>
PPS在这条推文中有一个动态gif的"现场"演示(因为不能在这里附加超过2mb的gif)。
一些意见使我走上了正确的道路,并帮助我解决了这个问题——我将简要地总结一下。
自相关性问题被怀疑,我安装的包错误消息的起源(在这种情况下fracdiff
)并再次尝试安装目标方案。错误再次发生,但来自不同的包,指示级联问题。奇怪的是,我确实知道这个包已经安装了,所以我觉得我最初的怀疑得到了证实,当我按照op中描述的更新R时,我可能把libs
文件夹弄得一团糟。
因为我可以假设这种情况会一次又一次地发生,所以结论是完全卸载R,这次也卸载了包,然后重新安装所有的东西。现在我可以在其他包中安装目标包了,没有任何问题。
幸运的是,这在Linux上非常容易。而且所有的包都可以在无人看管的情况下重新安装。how-to's分散在几个线程和站点上,我将把字符串放在一起,添加引用。
以下是我在R和Bash中所做的(您将需要su/sudo
):
- 存储包(在R中)1
tmp <- installed.packages()
installedpkgs <- as.vector(tmp[is.na(tmp[,"Priority"]), 1])
saveRDS(installedpkgs, 'installed_old.rds')
- 完全删除R2
dpkg -l | grep ^ii | awk '$2 ~ /^r-/ { print $2 }' | sudo xargs apt-get remove --purge -y
- 删除所有R包3
位置可能与您的不同。
R -e '.libPaths()'
rm -rf /home/jay/R/x86_64-pc-linux-gnu-library/4.2 /usr/local/lib/R/site-library /usr/lib/R/site-library /usr/lib/R/library
- 安装R(这里有
apt
)4
apt install r-base-core
- 恢复R包<一口>5一口>
运行一段时间。请注意,只有在存储库中可以找到的包才会被安装。
installedpkgs <- readRDS("installed_old.rds")
tmp <- installed.packages()
installedpkgs.new <- as.vector(tmp[is.na(tmp[,"Priority"]), 1])
missing <- setdiff(installedpkgs, installedpkgs.new)
install.packages(missing)
update.packages(ask=FALSE)