前言
最近剛回來券坞,發(fā)現(xiàn)實驗室服務(wù)器各種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中安裝包的時候調(diào)用了系統(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
內(nèi)容岸霹,使用這個方式,可以直接從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 ) 庫路徑予弧?
—— dulunar 后記于 2019.11