前言
R對windows使用很友好,對Linux來說充滿了敵意。小數據可以在windows下交互操作,效果很好很棒。可是當我們要處理大數據,或者要在集群上搭建pipeline時,不得不面對在Linux上裝R及想要的R包這個難題,尤其是對非root用戶而言更是艱難重重。
准備依賴庫
依次安裝:zlib/bzip/liblzma/pcre/curl,注意順序和版本。目前3.4以上3.6以下R版本相對較為穩定和不過時,我自己安裝的是3.5.2。
cd zlib-1.2.11
./configure --prefix =/your/path/zlib #一般最好新建一個目錄,以下同理
make
make install
cd bzip2-1.0.6
make -f Makefile-libbz2_so
然后修改 Makefile 中的PREFIX=/your/path/bzip2
make && make install
cd xz-5.2.3
./configure -prefix=/your/path/xz
make
make install
tar -zxvf pcre-8.41.tar.gz
cd pcre-8.41
./configure --enable-utf --enable-unicode-properties --enable-jit --disable-cpp --prefix /your/path/pcre
#按官方文檔的推薦命令的安裝參數
make
make install
tar -zxf curl-7.28.0.tar.gz
cd curl-7.28.0
./configure --prefix=/your/path/curl
make
make install
如果沒報錯,怎么知道自己安裝成功了呢?一般在各個庫的目錄下會新生成bin/include/lib/share等幾個目錄。
安裝R
源碼安裝方式同其他軟件步驟一樣,也是configure —— make —— make install,不過肯定沒那么順利,必然會有各種依賴庫找不到。
1. congure
configure是很重要的一步,檢查系統環境,准備編譯和鏈接所需依賴及其種種復雜關系,往往死在第一步。
./configure --prefix=/your/wantto/install/R --enable-R-shlib --with-cairo --with-jpeglib --with-readline --with-tcltk --with-blas --with-lapack --enable-R-profiling LDFLAGS="-L/your/path/zlib/lib -L/your/path/bzip2/lib -L/your/path/xz/lib -L/your/path/pcre/lib -L/your/path/curl/lib" CPPFLAGS="-I/your/path/zlib/include -I/your/path/bzip2/include -I/your/path/xz/include -I/your/path/pcre/include -I/your/path/curl/include"
# R也是最好新建一個要安裝的路徑再指定。指定各依賴庫的庫文件和頭文件。
2.make
configure成功,此時如果直接make,一般也會報錯,如下:
/usr/bin/ld: warning: libpcre.so.1, needed by ../../lib/libR.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: liblzma.so.5, needed by ../../lib/libR.so, not found (try using -rpath or -rpath-link)
即使configure已經指定傳入了PCRE和XZ這兩個庫的路徑,還是會說缺少libpcre.so.1和liblzma.so.5這兩個庫文件。
為什么呢?gcc編譯鏈接動態庫時很有可能編譯通過,但是執行時找不到動態鏈接庫,那是因為-L選項指定的路徑只在編譯時有效。
如果是root用戶,修改/etc/ld.so.conf文件,將前面安裝的庫的路徑添加到這個文件中。
如果是非root用戶(絕大多數的我們),解決方法是通過-Wl(大寫的W和小寫的L),rpath=<your_lib_dir>,使得execute記住鏈接庫的位置。
此時如果在configure的時候加上-Wl,並不會起作用。configure成功的時候不僅生成Makefile,還會生成Makeconf(即將configure的參數傳入),因此我們可以直接修改Makeconf中的參數。
LDFLAGS = -L/your/path/zlib/lib -L/your/path/bzip2/lib -L/your/path/xz/lib -L/your/path/pcre/lib -L/your/path/curl/lib -Wl,-rpath=/your/path/xz/lib -Wl,-rpath=/your/path/pcre/lib
# configure已經傳入-L參數,因此我們只需在后面加上-Wl參數並指定相應庫路徑。注:原來的-L參數仍要保留。
#-L參數只能讓路徑在gcc編譯時有效,而-Wl參數只能讓其在運行時有效。
make成功。
3.make install
make成功后,一般這一步沒啥問題。
參考:https://xieduo7.github.io/2018-04-02-R安裝.html
安裝R包
Linux下安裝R包一般有2種方式:
1. R CMD INSTALL
下載源碼
R CMD INSTALL /.../mypackage.tar.gz
也可指定安裝庫路徑:
R CMD INSTALL /.../mypackage.tar.gz --library=/your/lib/path
更多參數--help
一下
2. install.packages
which R
查看下路徑,是否是剛才自己安裝的R。敲R,或全路徑進入R
install.packages('mypackage')
,這種方式針對CRAN包。
一般會讓你選擇鏡像。選擇自己最近的,有的鏡像所含的R包不是很全,需要換一下。如果沒有自己想要的鏡像,也可自己指定(在R官網中可查鏡像https://cran.r-project.org/mirrors.html)。
install.packages("packages","repos" = (CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/"),lib="/lib/path")
以上針對的是CRAN中的包,如果是 bioconductor包呢?
先裝BiocManager,再安裝所需R包即可。
install.packages("BiocManager") #如已安裝,后續安裝不再需要
BiocManager::install("clusterProfiler")
不推薦以下安裝方法,速度會很慢。
source("http://bioconductor.org/biocLite.R")
biocLite("mypackage")
如果不指定R包安裝的路徑,R包會安裝在/your/R/lib64/R/library中,這也是R自帶的基礎包的目錄。
常見操作
1.包的操作和管理
- 添加環境變量:
export PATH=/your/R/bin:$PATH
export LD_LIBRARY_PATH=/your/complie_tools/zlib/lib:/your/complie_tools/curl/lib:/your/complie_tools/bzip2/lib:/your/complie_tools/pcre/lib:/your/complie_tools/xz/bin:/your/R/lib64/R/lib:$LD_LIBRARY_PATH #這些都是一些依賴庫
- 添加R庫路徑到環境變量:
export R_LIBS=/your/R_packages
export R_LIBS=/others/.../R/lib64/R/library #添加環境變量R的lib路徑,可以使用別人安裝的包
R中用.libPaths()函數查看lib路徑,如果有多個lib,install.packages()默認是安裝在第一個目錄下。如果一開始就沒指定R包安裝路徑並配置環境變量,則默認安裝在/your/R/lib64/R/library中。
2. 其他操作
其實和window控制台一樣,只是換成了單命令行:
.libPaths() #查看包的安裝目錄
library() #查看已經安裝的包目錄
library(package) #載入mypackage包
getOption("defaultPackages") #查看啟動R時自動載入的包。
help(package = 'mypackage') #查看‘mypackage’的幫助
args(function):查看函數的參數
example(function):自動運行該函數幫助文檔中的例子,很贊!
demo("package"):展示包中demo
vignette('mypackage'):有的包特別是bioconductor的包有vignette
openVignette('mypackage'):這個函數也可以查看vignette,更好用一些
RSiteSearch("helpinfor"):搜索R網站上的“helpinfor”相關信息
help.start():查看已經安裝包的詳細HTML文檔,這個命令非常爽。
search():查看當前載入的包
sessionInfo():查看R中載入的包
methods():查看某個S3泛型函數中所有的方法或者一個類中所有的方法(S3:S version 3)
showMethods(class = "myClass"):查看S4類的方法
findMethods("myMethods"):查看method的代碼
class(myObject):查看某個對象的類
getClass(“class/package”):查看某個class或者包的具體內容
getSlots("class"):查看某個class的slot
slotNames(MyObject):查看某個對象的slot。
可以使用Myobject@slotNames訪問對象的slot值,這個@設計實在是太爽了,可以連續用。
查詢包內信息:
1. ?function/method:查看某個“函數”或者“方法”的詳細內容
2. class?graph::graph:查看“組”的詳細內容的一個例子。這個例子的來源是查詢graph包時候,查看其中class的信息,輸入??graph后出現一個graph::graph-class。
ls("package:mypackage"):查看"mypackage"中的所有對象。
Ref: https://www.cnblogs.com/xianghang123/archive/2013/01/08/2851450.html