安裝R包出現(xiàn)load failed錯誤

前言

最近剛回來,發(fā)現(xiàn)實驗室服務器各種bug,首先apt升級了一些軟件,然后老版本的R 3.3.1升級到了3.6.1,于是乎出現(xiàn)以前安裝的包不能在當前版本用

package ‘scales’ was installed by an R version with different internals; it needs to be reinstalled for use with this R version

于是跟著更新了一下:

update.packages(checkBuilt=TRUE, ask=FALSE)

大部分都正常了,但是還是有些包沒法使用,只能再重新安裝了:

install.packages("tidyverse", clean=TRUE, dependencies=TRUE)

可是在安裝某些R包的過程中還是出現(xiàn)了一些錯誤,例如:

Error: package or namespace load failed for ‘haven’ in dyn.load(file, DLLpath = DLLpath, ...):
 unable to load shared object '/home/luna/Desktop/Software/R-3.2.5/lib64/R/library/00LOCK-haven/00new/haven/libs/haven.so':
  /home/luna/Desktop/Software/R-3.2.5/lib64/R/library/00LOCK-haven/00new/haven/libs/haven.so: undefined symbol: libiconv
Error: loading failed
Execution halted
ERROR: loading failed
removing ‘/home/luna/Desktop/Software/R-3.2.5/lib64/R/library/haven’

Error: package or namespace load failed for ‘readx1’ in dyn.load(file, DLLpath = DLLpath, ...):
Error: package or namespace load failed for ‘ tidyverse’ in dyn.load(file, DLLpath = DLLpath, ...):

解決

其實錯誤的根本是在R中安裝包的時候調用了系統(tǒng)安裝的非R的動態(tài)庫,在本地lib路徑( 不是 R 軟件包) 中有 libiconv.so,包含在 LD_LIBRARY_PATH 中,在 R 會話中驗證也可以發(fā)現(xiàn)

Sys.getenv("LD_LIBRARY_PATH")

具有該目錄。但是R 庫加載程序時無法找到這里共享對象,所以這個錯誤就是R包的非R依賴項的問題。

清洗器解決方法

使用withr::with_makevars,這個方法允許臨時控制Makevars內容,使用這個方式,可以直接從repo安裝R包:

withr::with_makevars(c(PKG_LIBS = "-liconv"), install.packages("haven"), assignment = "+=")

## or

with_makevars(c(PKG_CFLAGS = "-std=c11"), install.packages("plyr", repos = NULL, type = "source"), assignment = "+=")

要使用這個方法,只需要已經(jīng)安裝了withr,這個是devtools的依賴使用。

參考

dynamic-loading - 如何在 R 中指定動態(tài)庫加載的( 非 R ) 庫路徑?

如何使用選項-std = c99來安裝R包

with_makevars

                                —— dulunar 后記于 2019.11
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容