自从上一次服务器重装系统之后,总感觉缺少了一些东西,安装R包很多依赖库报错,也可以解决,但总是存在,烦。
一天,一个同事问我说ggpubr
包安装不成功,我就自己试了一下,真的是……安装不成功。
当你到了我这个年纪(破罐子破摔),你就会知道,如果有包安装不上,那就不安装了。所以我就用资深数据分析师那意味深长的语气劝他(而且一定要营造出分析结果不理想是他数据的问题),R包有很多,为何不换一个呢?
今天,另一个同事告诉我,说服务器的clusterProfiler
和enrichplot
自从重新装了服务器,就没有安装成功做,做分析都是放到个人电脑上去做的。不能忍,今天就解决。因为我知道,折腾一下总能解决,但是我只想躺平。
1. 系统环境
- 操作系统
centos7
- R 版本
MRO4.0.2
- 有root权限
- 需要安装
clusterProfiler
和enrichplot
包
2. 头脑风暴
我有一个设想:
- 用root权限,新建一个环境
R4.1
,然后在里面安装R4.1 - 在R4.1中安装那几个包
- 将Rstudio的R版本设置为新建环境的R4.1
我的顾虑:
- 不确定我用root新建的环境,能不能让大家使用
- 不确定Rstudio-server能不能指定新建环境中的R4.1版本
3. 新建conda环境并激活进入
因为conda环境还挺大,所以我在空间大的地方,新建文件夹R4.1_and_Rstudio
新建环境:
conda create -p /mnt/data/R4.1_and_Rstudio
激活进入环境:
source activate /mnt/data/R4.1_and_Rstudio/
4. 安装R最新版R4.1.0
一行代码搞定:
conda install -c conda-forge r-base
安装成功之后,进入R:
R version 4.1.0 (2021-05-18) -- "Camp Pontanezen"
Copyright (C) 2021 The R Foundation for Statistical Computing
Platform: x86_64-conda-linux-gnu (64-bit)
R是*软件,不带任何担保。
在某些条件下你可以将其*散布。
用‘license()‘或‘licence()‘来看散布的详细条件。
R是个合作计划,有许多人为之做出了贡献.
用‘contributors()‘来看合作者的详细情况
用‘citation()‘会告诉你如何在出版物中正确地引用R或R程序包。
用‘demo()‘来看一些示范程序,用‘help()‘来阅读在线帮助文件,或
用‘help.start()‘通过HTML浏览器来看帮助文件。
用‘q()‘退出R.
>
可以看到,R4.1.0安装成功。
5. 安装最新版RStudio
一行代码搞定:
wget https://download2.rstudio.org/server/centos7/x86_64/rstudio-server-rhel-1.4.1717-x86_64.rpm
sudo yum install rstudio-server-rhel-1.4.1717-x86_64.rpm
好吧,这是两行。
6. 修改设置Rstudio-server选择R版本
修改参数:
vi /etc/rstudio/rserver.conf
将下面代码放到里面:
rsession-which-r=/mnt/data/R4.1_and_Rstudio/bin/R # 注意,这里是我们服务器上R4.1.0的路径
重启Rstudio-server
sudo rstudio-server status #查看RStudio-server
sudo rstudio-server stop #关闭RStudio-server
sudo rstudio-server restart #重启RStudio-server
重启之后,打开Rstudio-server,发现R版本已经变为R4.1.0
了,搞定!
7. 在conda环境中安装R包
R4.1.0
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("clusterProfiler")
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("enrichplot")
原本以为能安装成功,结果发现报错,类似这样:
显示上面的包都安装失败,那我就分开安装,然后都安装成功了,最后这两个包也安装成功了。
胜利的喜悦:
8. Rstudio画图报错:version ZLIB_1.2.9 not found
其实,在R终端下,载入上面的软件包没问题,但是在Rstudio中载入就出错:
> library(clusterProfiler)
错误: package or namespace load failed for ‘clusterProfiler’ in dyn.load(file, DLLpath = DLLpath, ...):
无法载入共享目标对象‘/mnt/data/R4.1_and_Rstudio/lib/R/library/png/libs/png.so’::
/lib64/libz.so.1: version `ZLIB_1.2.9‘ not found (required by /mnt/data/R4.1_and_Rstudio/lib/libpng16.so.16)
> library(clusterProfiler)
错误: package or namespace load failed for ‘clusterProfiler’ in dyn.load(file, DLLpath = DLLpath, ...):
无法载入共享目标对象‘/mnt/data/R4.1_and_Rstudio/lib/R/library/png/libs/png.so’::
/lib64/libz.so.1: version `ZLIB_1.2.9‘ not found (required by /mnt/data/R4.1_and_Rstudio/lib/libpng16.so.16)
然后作图也报错:
> plot(1)
Error in RStudioGD() :
Shadow graphics device error: r error 4 (R code execution error)
此外: There were 50 or more warnings (use warnings() to see the first 50)
太难了,以为所有问题都解决了,出了这幺蛾子。
多年的(摸鱼)经验告诉我,不慌,先解决这个问题/lib64/libz.so.1: version
ZLIB_1.2.9’ not found`
先查看这个lib有哪些版本:
strings /lib64/libz.so.1 |grep "ZLIB*"
结果:
ZLIB_1.2.0
ZLIB_1.2.0.2
ZLIB_1.2.0.8
ZLIB_1.2.2
ZLIB_1.2.2.3
ZLIB_1.2.2.4
ZLIB_1.2.3.3
ZLIB_1.2.3.4
ZLIB_1.2.3.5
ZLIB_1.2.5.1
ZLIB_1.2.5.2
ZLIB_1.2.7.1
果然没有ZLIB_1.2.9
,那我看看服务器都有哪些/libz.so.1
:
find / -name "libz.so.1"
选几个看看看有没有ZLIB_1.2.9
,然后将lib64的lib删掉,重新建立软链接。
# 确认其中的某一个libz.so.1含有ZLIB_1.2.9
strings /home/softwares/anaconda3/lib/libz.so.1 |grep "ZLIB*"
# 替换
rm /usr/lib64/libz.so.1
# 也可以使用ln -s来创建软连接
cp /home/softwares/anaconda3/lib/libz.so.1 /usr/lib64/
再次运行Rstudio-server,搞定!
9. 其它人用Rstudio-server安装R包
因为现在Rstudio-server用的是conda环境中的R4.1,它会在conda环境中有一个library,普通用户没有写入的权限,安装R包时会在自己的路径下自动新建一个library。如果安装包出错,就进入conda的环境,安装即可,绝对可以成功。
特别好使!
10. 总结
1,conda新建环境安装R4.1.0,因为是全新的环境,可以安装任何包都不会报错,如果报错了,就分开安装,然后再安装,一般都能解决问题。
2,外部是可以用conda环境中的程序的,指定路径就行。
3,Rstudio-server可以指定R版本,在/etc/rstudio/rserver.conf
设置一下就行
4,如果有些软件安装比较麻烦,各种报错,不要在root下安装了,直接新建conda环境,在环境中安装配置好,用得时候绝对调用就行。
5,没有安装不了的R包,折腾一下总能实现。
参考:
http://showteeth.tech/posts/741.html
https://cloud.tencent.com/developer/article/1819222
?