[Linux]非root的R環境被conda破壞后如何恢復?


記錄說明

這篇文章本來是用來記錄Linuxroot環境下安裝PMCMRplus包折騰過程,但后來試過了各種方法安裝不上這個R包后,我換上了Miniconda來安裝。經前人提醒,一開始安裝Miniconda我是沒加入環境變量的。但一直激活不了虛擬環境,所以后來我又加入了環境變量試着安裝,結果這一弄還真的污染了我原有的環境,很多R包都加載和下載不了了。於是我卸了conda,重新安裝R。但環境變了后,不管我是安裝新的函數庫,還是用之前的編譯好的依賴庫,怎么都安裝不上了,我甚至安裝新版GCC重新編譯也不行。能試的都試過之后,我決定重新恢復原有的RR包。怎么做呢?有耐心的可以看看我折騰的過程,沒耐心的直接翻到最后就好。

安裝PMCMRplus

PMCMRPMCMRplus是用來做秩和檢驗的R包,在Linux上安裝時,后面那個PMCMRplus包出現了問題。

ERROR: dependency ‘Rmpfr’ is not available for package ‘PMCMRplus’

安裝Rmpfr依賴時,出現了如下問題:

configure: error: MPFR Library must be at least version 3.0.0, see README
ERROR: configuration failed for package ‘Rmpfr’

是系統MPFR 版本太低了。MPFR是什么我也不知道,大概是和大數值相關的運算有關,而且和GMP一起常作為GCC安裝的依賴。所以重裝MPFR,下載地址https://www.mpfr.org/mpfr-current/。如果是root用戶,這個問題一下解決了。

sudo apt-get install libmpfr-dev #Ubuntu系列
sudo dnf install mpfr-devel #Centos系列

再重新安裝下R包就行了。但是非root安裝依賴庫很麻煩,只能源碼編譯安裝。

wget https://www.mpfr.org/mpfr-current/mpfr-4.0.2.tar.bz2
tar -jxvf mpfr-4.0.2.tar.bz2
mkdir mpfr4 && cd mpfr-4.0.2
./configure --prefix="/path/software/mpfr4"

沒那么容易,報錯了:

checking whether gcc __attribute__ ((mode (XX))) works... yes
checking for recent GMP... no
configure: error: GMP 5.0.0 or newer is required

要升級GMP版本,GMP(The GNU Multiple Precision Arithmetic Library)又叫GNU多精度算術庫,是一個提供了很多操作高精度的大整數,浮點數的運算的算術庫,幾乎沒有什么精度方面的限制,功能豐富。
於是下載GMP,安裝。下載地址:https://gmplib.org/#DOWNLOAD
好像除了6,沒有其他版本。

wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.bz2
tar -jxvf gmp-6.1.2.tar.bz2
mkdir gmp6 && cd gmp-6.1.2
./configure --prefix="/path/software/gmp6"
make
make check
make install

GMP6安裝成功后,再次安裝mpfr,配置時需要指定gmp6路徑:

./configure --prefix="/path/software/mpfr4" --with-gmp=/path/software/gmp6
make
make install

再重新安裝Rmpfr包,但還是報同樣的錯。於是將兩個庫加入環境中:

export LD_LIBRARY_PATH=/path/software/gmp6/lib:/path/software/mpfr4/lib:$LD_LIBRARY_PATH

問題還是存在,莫非要安裝新的gcc嗎?暫時擱下了,后續再說吧,linux真的好煩,哎~~~

configure: error: MPFR Library must be at least version 3.0.0, see README
ERROR: configuration failed for package ‘Rmpfr’
* removing ‘/ldfssz1/SP_MSI/USER/pengjianxiang/software/R_packages/Rmpfr’

下次裝個新的GCC試試吧。


更新

實際上我重新裝了一個GCC,將其所有依賴(包括GMPMPFR)一並安裝后也沒有安裝上Rmpfr包。而Rmpfr的依賴包gmp是可以裝上的。
image.png

最奇怪的是,我即使是指定MPFR庫和GMP庫來安裝這個R包(包括GCC自動安裝的依賴和我之前手動安裝的這兩個庫)也鏈接不上。

我是怎么指定依賴庫的呢?經同事指點,找到了configure.args參數。指定庫的頭文件和庫文件。

#安裝gcc時自動安裝的依賴庫
install.packages("Rmpfr",configure.args = c(Rmpfr = "--with-mpfr-include=/path/to/mpfr-3.1.4/include \\
--with-mpfr-lib=/path/to//mpfr-3.1.4/lib"))

#手動安裝的依賴庫
install.packages("Rmpfr",configure.args = c(Rmpfr = "--with-mpfr-include=/path/to//mpfr4/include \\
--with-mpfr-lib=/path/to//mpfr4/lib"))

結果還是鏈接到了原來舊版本的MPFR上。但這個人說他可以https://stackoverflow.com/questions/37287226/pass-configure-arguments-to-install-packages-in-r
,但我的就是連接不上。
image.png

同樣,下載源碼,在終端命令行下安裝也報相同的錯誤。

R CMD INSTALL  --configure-args="--with-mpfr-include=/ldfssz1/SP_MSI/USER/pengjianxiang/software/mpfr-3.1.4/include \\
--with-mpfr-lib=/ldfssz1/SP_MSI/USER/pengjianxiang/software/mpfr-3.1.4/lib" Rmpfr_0.7-2.tar.gz

也試了下--configure-vars這個參數:

R CMD INSTALL --configure-vars='INCLUDE_DIR=... LIB_DIR=...'

不行。最后我試着解壓Rmpfr源碼,直接編譯。configure中有--with-mpfr-include--with-mpfr-lib參數,我指定庫路徑進行編譯准備,可以通過。

image.png
但生成的不是Makefile文件,而是src目錄下的Makevars等文件。我也不知道能不能這么弄,反正不能make,最后也不能編譯。
image.png
還有個方法試下,就是用conda了。

第二次更新

這一次用conda來安裝試試。關於非root用戶安裝conda可以看看這個

conda create -n meta
source activate meta
conda search r-rmpfr  #可事先大小寫分別在anaconda上試着搜一下
conda install r-rmpfr

安裝成功后,which r-rmpfr找不到。用find命令來找找,試了大小寫,最后找到,不知道為什么這么多庫路徑,也不知該用哪個:

$ find ./ -name '*Rmpfr'
./pkgs/r-rmpfr-0.7_2-r36ha9c3b96_1/lib/R/library/Rmpfr
./pkgs/r-rmpfr-0.7_2-r36ha9c3b96_1/lib/R/library/Rmpfr/R/Rmpfr
./envs/meta/lib/R/library/Rmpfr
./envs/meta/lib/R/library/Rmpfr/R/Rmpfr

最起碼Rmpfr在系統上是安裝上了,再試着安裝下PMCMRplus包吧。接下來就有兩種情況了:一是退出虛擬環境進入R,再指定庫路徑安裝;二是仍在虛擬的conda環境中進入R,再進行安裝。

首先是第一種情況:

$which R
#R仍然是我用的R3.5.2
$R
R version 3.5.2 (2018-12-20) -- "Eggshell Igloo"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

>.libPaths()
[1] "/my/software/R_packages"
[2] "/my/software/conda/miniconda/envs/meta/lib/R/library"
#庫路徑將conda的也加入了
> install.packages("PMCMRplus")
#然而失敗了。

載入Rmpfr包試試:

> library(Rmpfr)
Error in library(Rmpfr) : there is no package called ‘Rmpfr’
> library(Rmpfr,lib="/my/software/conda/minicondaLoading required package: gmp

Attaching package: ‘gmp’

The following objects are masked from ‘package:base’:

    %*%, apply, crossprod, matrix, tcrossprod

Error: package or namespace load failed for ‘Rmpfr’ in rbind(info, getNamespaceInfo(env, "S3methods")):
 number of columns of matrices must match (see arg 2)
In addition: Warning message:
package ‘Rmpfr’ was built under R version 3.6.1

可知雖然Rmpfr已安裝,但conda是用R3.6.1安裝的,而我的R版本是3.5.2,因此在我的R上不能作為依賴來安裝PMCMRplus

再看看第二種情況:

$ R

R version 3.6.1 (2019-07-05) -- "Action of the Toes"
Copyright (C) 2019 The R Foundation for Statistical Computing
Platform: x86_64-conda_cos6-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.

> .libPaths()
[1] "/ldfssz1/SP_MSI/USER/pengjianxiang/software/R_packages"
[2] "/ldfssz1/SP_MSI/USER/pengjianxiang/software/conda/miniconda/envs/meta/lib/R/library"

> install.packages("PMCMRplus")
#等了半天,比一般安裝要慢很多。


conda是用R3.6.1安裝的Rmpfr,庫路徑也是兩個。晚上睡覺去了,放在后台龜速安裝,不知為何,最后沒裝成功。

那么不進入虛擬環境,用conda安裝的R直接安裝這個包會如何呢?

$ /my/software/conda/miniconda/envs/meta/bin/R
> library(Rmpfr) #success
> .libPaths()
[1] "/my/software/R_packages"
[2] "/my/software/conda/miniconda/envs/meta/lib/R/library"
> library(PMCMRplus)
Error in library(PMCMRplus) : there is no package called ‘PMCMRplus’
> install.packages("PMCMRplus") #fail

> install.packages("PMCMRplus",lib="/my/software/conda/miniconda/envs/meta/lib/R/library")
make: *** [crwrapf90.o] Error 127
ERROR: compilation failed for package ‘PMCMRplus’

竟然還是失敗的!若要解決,除非都用conda來安裝R及其R包,工作量巨大。【補充:其實這個我后面也試過了,conda安裝的R,根本運行不起來】


第三次更新

WF慈悲!果然成功地污染了之前的R環境,加載一些包的時候已經報錯了。不得不重新安裝。

> library(WGCNA)
Loading required package: dynamicTreeCut
Loading required package: fastcluster

Attaching package: ‘fastcluster’

The following object is masked from ‘package:stats’:

    hclust


Error: package or namespace load failed for ‘WGCNA’ in rbind(info, getNamespaceInfo(env, "S3methods")):
 number of columns of matrices must match (see arg 2)

然而即便是注釋掉conda的環境變量,從頭安裝如WGCNA等包,也還是報錯:

Error in rbind(info, getNamespaceInfo(env, "S3methods")) :
  number of columns of matrices must match (see arg 2)
ERROR: lazy loading failed for package ‘WGCNA’

於是手動將之前安裝的WGCNA全刪掉,再重新安裝。還是不行!把所有的包全都更新了一遍,發現有很多包已經被破壞,裝不上了。

解決方法

我決定重新裝一個R!我想這個我有經驗,應該沒問題,就是麻煩了點。事實再次證明了圖樣圖森破,無論我如何折騰都裝不上了。包括用之前的gcc及其編譯的依賴庫,還是我新安裝gcc來重新編譯,反正就是報各種各樣的缺函數庫的錯。期間我也重新安裝了Anaconda來解決,無濟於事。最后我決定恢復原有的R及其R包!

我之前的R已經編譯完裝好,應該不會有問題。根據報錯提示,我先看看具體哪些包有哪些問題,但這樣不能窮盡,很麻煩。加載或重新下載不成功的R包幾乎都有這么一條錯誤:

Error in rbind(info, getNamespaceInfo(env, "S3methods"))

我們安裝軟件包時,都會創建一個名為 .__ NAMESPACE__ 的隱藏環境 。它包含許多對象,報這個錯誤預示着其中一個被稱為 S3methods的文件已損壞。這些應該都是R庫文件,那么我能不能建立全新的一個R包庫來解決呢?事實證明竟然是可以的!於是我將環境變量的R庫路徑注釋掉,重新建立了一個新的庫路徑,將所有R包轉移到這一個路徑上來。麻是麻煩了點,但總比我各種嘗試導致崩潰要強點。

#export R_LIBS=/my/before/path/R_packages

這里要感謝這個回答給了我提示。否則我永遠也不知道下一個正確的解決方法是什么。血的代價告訴自己,再也不輕易破壞環境了。

Ref:https://blog.csdn.net/u013310119/article/details/81081125
https://www.jianshu.com/p/bc909ce2e424
install-gcc-5.4-without-root


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM