簡體   English   中英

r update.packages()不更新由其他包導入的包

[英]r update.packages() not updating packages that are imported by other packages

我最近從3.4.3更新到R 3.5.1。 我更新了我的包,如下所示:

(a)將舊庫中的包復制到我的新庫中(注意不要覆蓋基礎包)

(b)運行update.packages(ask = FALSE, dependencies = TRUE)

我發現許多軟件包沒有安裝在它們作為其他軟件包的導入列出的地方,因為它們是“使用不同內部的r版本創建的,需要重新安裝”。

有點令人沮喪的是,這條消息似乎正在迭代一些隱藏的相關或鏈接包列表,但只告訴我一次一個包有問題; 即我會安裝具有錯誤版本的軟件包,然后嘗試重新安裝它已阻止安裝的軟件包,只是為了不同的軟件包重復出錯。 我不得不經歷多次,直到沒有更多不正確版本的相關軟件包,最后我需要使用的軟件包可以安裝/更新。

另外 - 我注意到一些軟件包是從源代碼安裝的(這些軟件包經常但不完全是導致上述相關軟件包出現'不同內部'錯誤的軟件包)。 我確實安裝了Rtool,所以對我來說不是問題,但只是觀察,因為update.packages每次遇到比Windows二進制文件更新的源版本時都會這樣做(我有一台Windows 10 PC)。

我從這一切得出結論, update.packages跳過了很多軟件包,實際上並沒有因為某種原因更新它們? 我仍然在尋找沒有更新的軟件包。

例如:

> DescTools::Gmean(x)
Error: package ‘expm’ was installed by an R version with different internals; it needs to be reinstalled for use with this R version

這里查看DescTools的CRAN條目表明包expm不是依賴項,而是導入的。

但是?import.packages說的dependencies參數:

依賴關系:

邏輯指示是否還安裝這些軟件包依賴/鏈接到/ import / suggest的已卸載軟件包(等等遞歸)。 如果repos = NULL,則不使用。 也可以是字符向量,c的子集(“Depends”,“Imports”,“LinkingTo”,“Suggests”,“Enhances”)。

僅當lib的長度為1(或缺失)時才受支持,因此在哪里安裝依賴包是明確的。 如果不是這種情況,則會被忽略,並發出警告。

默認值NA表示c(“取決於”,“導入”,“鏈接到”)。 TRUE表示為pkgs和c(“取決於”,“Imports”,“LinkingTo”)使用c(“Depends”,“Imports”,“LinkingTo”,“Suggests”)來添加依賴項:這將安裝所需的所有包運行pkgs,他們的例子,測試和小插曲(如果包作者正確指定了它們)。

在所有這些中,對於二進制包,省略了“LinkingTo”。

這意味着update.packages(...dependencies = TRUE)應該更新和/或安裝其他包導入的所有包。

我錯過了什么?

更新到R 3.6.0后,我遇到了同樣的問題。 在我的例子中,Carlos Santillan的解決方案略有改動解決了這個問題:

for (i in 2:length(.libPaths())) {
  lib <- .libPaths()[i]
  install.packages( 
    lib  = .libPaths()[1] ,
    pkgs = as.data.frame(installed.packages(lib), stringsAsFactors=FALSE)$Package,
    type = 'source'
  )
}

在我的設置中.libPaths()返回以下內容:

> .libPaths()
[1] "/home/wassermann/R/x86_64-pc-linux-gnu-library/3.6" "/usr/local/lib/R/site-library"                
[3] "/usr/lib/R/site-library"                            "/usr/lib/R/library"    

.libPaths()中的第一個目錄在用戶級別是可寫的,其他三個目錄是只讀的。 代碼遍歷只讀文件夾中的所有包,並將其較新版本安裝在用戶可寫目錄中。 它不是最優的,因為它可能會多次迭代某些包,但是你需要只運行一次,之后所有的包都會安裝而不會出現“不同的內部”錯誤。

看起來依賴= TRUE不是update.packages的參數,而是將它傳遞給install.packages

文檔

https://www.rdocumentation.org/packages/utils/versions/3.5.1/topics/update.packages

使用update.packages使用依賴項(傳遞給install.packages)時要小心,因為不清楚應該在哪里安裝新的依賴項。 當使用該庫時,如果要更新的所有包都在單個庫中,則當前實現將僅允許它。

以下腳本將重新安裝所有包

lib <- .libPaths()[1]
install.packages( 
    lib  = lib ,
    pkgs = as.data.frame(installed.packages(lib), stringsAsFactors=FALSE)$Package,
    type = 'source'
)

以下將更新檢查是否所有包都需要更新

lib <- .libPaths()[1]
update.packages( 
 oldPkgs = as.data.frame(installed.packages(lib), stringsAsFactors=FALSE)$Package,
  type = 'source',
  ask = FALSE
)

(上面是從https://www.r-bloggers.com/update-all-user-installed-r-packages-again/修改的)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM