簡體   English   中英

通過 library() / 描述文件使用 R 包中的依賴項

[英]Use dependencies in R packages through library() / Description file

我正在寫一個 R 包,它有幾個其他包的依賴關系,其中一些在 CRAN 中可用,其他的是自制的。

根據幫助, library("my_package")將在我之前安裝包后加載包的命名空間,即install.package("my_package")

盡管如此,一旦我安裝了包,我就可以通過my_package::my_function()使用已安裝但未加載包的所有功能,所以如果我的包有依賴項,除了將它們添加到DESCRIPTION文件中:

Imports:
    dplyr,
    my_package2,
    ggvis,

在包文件夾的根目錄中。 我是否必須通過library()加載新包的依賴項,或者如果最終用戶沒有在他的計算機上安裝,因為在導入部分指定了所需的包,最終用戶將看到一個錯誤?

不,用戶不必加載my_package中函數使用的包。

事實上,您在Imports:下列出了一個包,在DESCRIPTION文件中意味着在安裝my_package期間,R 將檢查該包在您的系統上是否可用。 這意味着my_package中的函數可以按照您的建議使用::表示法使用這些包中的函數。

使用::表示法是引用其他包中函數的推薦方法,但也有其他選項:

  • 為了使dplyr中的所有功能無需:: in my_package即可訪問,您可以將import(dplyr)添加到NAMESPACE文件中。 如果您使用一個包中的許多函數,這很方便。

  • 如果您打算只使用函數select from dplyr ,您可以將importFrom(select, dplyr)添加到NAMESPACE文件中。

  • 您還可以將包添加到Depends:下的DESCRIPTION文件中。 這意味着當您使用library(my_package)時,包被加載到全局環境中。 這幾乎從來都不是一個好的解決方案。

依賴關系的一般想法是 R 是my_package將具有它依賴加載的包的“它自己的版本”。 因此,您始終可以確定,例如,您將按照您的預期使用dplyr包中的函數select() 例外是Depends:的使用繞過了這個系統。 在這種情況下, my_package將在全局環境中查找函數,如果有人應該在全局環境中定義了一些名為select()的函數, my_package將使用該函數,您將得到意想不到的結果。

示例 1:

DESCRIPTION文件:

Imports:
    dpylr

來自my_package的一些功能:

my_fun <- function(...) {
    dplyr::mutate(...) %>%
    dplyr::select(1:3)
}

示例 2:

DESCRIPTION文件:

Imports:
    dpylr

NAMESPACE文件:

import(dplyr)

來自my_package的一些功能:

my_fun <- function(...) {
    mutate(...) %>%
    select(1:3)
}

示例 3:

DESCRIPTION文件:

Imports:
    dpylr

NAMESPACE文件:

importFrom(dplyr,select)

來自my_package的一些功能:

my_fun <- function(...) {
    dpylr::mutate(...) %>%
    select(1:3)
}

您可以在網絡上的 R 包中找到有關如何處理依賴項的更詳細說明。 例如,以下內容很有用:

此外,不必手動編寫NAMESPACE文件。 你可以讓roxygen2為你做這件事。 閱讀文檔以獲取更多信息。

暫無
暫無

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

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