先參考https://mac.r-project.org/tools/ 安裝好XCode和gfortran
目前(截止到2022年2月份), Arm64架構(gòu)的R能夠直接安裝CRAN絕大部分的R包,但是Bioconductor的R包都需要編譯(這也就為什么我推薦用Intel架構(gòu)的R,可以避免遇到要編譯R包里的坑)。
編譯R包最怕遇到的問題,就是遇到R以外的底層庫的依賴,比如說Rhtslib, 就要求編譯htslib, 而htslib依賴lzma是MacOS默認(rèn)沒有安裝,因此我們會(huì)因?yàn)槿鄙賦z庫的支持,導(dǎo)致htslib編譯失敗,從而導(dǎo)致Rhtslib安裝失敗,間接導(dǎo)致所有依賴于Rhtslib的R包無法使用。還有一些R包編譯需要gsl庫,就會(huì)因?yàn)檎也坏?gsl-config 而報(bào)錯(cuò)。
經(jīng)過我不斷踩坑后,我整理了解決方案。后續(xù),如果你也打算在Arm64的Mac上安裝原生的R,就按照我的思路來配置
首先,你需要安裝homebrew, 國內(nèi)用戶推薦按照清華鏡像里的方案來配置,https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/ , 能夠避免網(wǎng)絡(luò)問題導(dǎo)致的坑。在海外的朋友,就按照官方站點(diǎn), brew.sh 的命令來配置。
homebrew會(huì)安裝在 /opt/homebrew下,該目錄里面包括后續(xù)安裝的軟件(bin), 頭文件(include)和動(dòng)態(tài)鏈接庫(lib).
之后,我們需要為R配置相關(guān)環(huán)節(jié),使得R能夠調(diào)用到homebrew安裝的環(huán)境。
我們需要打開R,然后運(yùn)行如下命令
file.edit(file.path(Sys.getenv("R_HOME"), "etc", "Makeconf"))
如此就能打開R的Makeconf文件,R就通過該文件里面的參數(shù)來進(jìn)行R包和底層依賴的編譯。我們搜索搜索 CFLAG, 添加 -I/opt/homebrew/inlucde, 搜索LDFLAGS, 添加 -L/opt/homebrew/lib, 效果如下
CFLAGS = -I/opt/homebrew/include -falign-functions=64 -Wall -g -O2 $(LTO)
LDFLAGS = -L/opt/R/arm64/lib -L/opt/homebrew/lib
重啟R/RStudio之后,你就能編譯安裝Rhtslib(當(dāng)然你需要先運(yùn)行 brew install xz,把lzma.h 裝好`)
BiocManager::install("Rhtslib")
此外你可能還會(huì)遇到gsl-config not found報(bào)錯(cuò),盡管你明明用brew install gsl安裝了軟件,也能夠在命令行中成功調(diào)用 gsl-config,但是R就是視而不見。 這是因?yàn)镽讀取的變量,默認(rèn)就來自于MacOS的環(huán)境變量來自于 /etc/path文件和 /ect/path.d目錄里。 因此,你即便在.zshrc, 或者.bashrc里面加入了 homebrew 的路徑,R也是不認(rèn)的。
解決方案,打開R,然后運(yùn)行如下命令,
file.edit("~/.Rprofile")
添加如下內(nèi)容,修改R啟動(dòng)時(shí)的環(huán)境變量
Sys.setenv("PATH"=paste0( "/opt/homebrew/bin:/opt/homebrew/sbin:", Sys.getenv("PATH")))
重啟R/Rstudio之后,R就能夠用到homebrew安裝的程序了。
或者,我們也可以下載到本地,用 R CMD INSTALL進(jìn)行編譯安裝,以DirichletMultinomial為例
wget https://mirrors.tuna.tsinghua.edu.cn/bioconductor/packages/3.14/bioc/src/contrib/DirichletMultinomial_1.36.0.tar.gz
R CMD INSTALL DirichletMultinomial_1.36.0.tar.gz
總結(jié)一下:
- 通過homebrew來安裝依賴環(huán)境
- 編譯R的Makeconf使得R能夠調(diào)用homebrew里的include和lib
- 編譯R的.Rprofile修改PATH,使得R能夠用到hombrew的bin的程序