如何从我的包中加载另一个包的数据

How do I load data from another package from within my package

我正在开发的包中的一个函数使用了来自 acs:: 包(fips.state 对象)的数据集。我可以通过

将这些数据加载到我的工作环境中
data(fips.state, package = "acs"),

但我不知道为我的函数加载此数据的正确方法。我试过了

 @importFrom acs fips.state,

但是没有导出数据集。我不想复制数据并将其保存到我的包中,因为这似乎是一种糟糕的开发实践。

我查看了 http://r-pkgs.had.co.nz/namespace.html, http://kbroman.org/pkg_primer/pages/docs.html, and https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Data-in-packages,但它们不包含任何关于从一个包到另一个包共享数据集的信息。

基本上,我如何制作另一个包中的函数所需的数据集可供我的包中的函数使用?

您始终可以在包代码中的任何位置使用 package::object_name(例如,dplyr::starwars),而无需使用 import 语句。


is_starwars_character <- function(character) {
  character %in% dplyr::starwars$name
}
is_starwars_character("Luke Skywalker")
#> [1] TRUE
is_starwars_character("Indiana Jones")
#> [1] FALSE

如果您无法控制 acs,那么 acs::fips.state 似乎是您最好的选择,正如@paleolimbot 所建议的那样。

如果您打算频繁调用 fips.state,那么我建议通过 fips.state <- acs::fips.state 制作一个本地副本,因为从其他包中查找对象的成本很小你可能会做得很好,避免多次发生。

但是如果你能够影响acs(即使你不能,我认为这是一个有用的概括),那么mikefc 建议另一种解决方案,即将 fips.state 对象设置为包内部对象,然后将其导出:

usethis::use_data(fips.state, other.data, internal = FALSE)

然后在命名空间中:

export(fips.state)

或者如果使用 roxygen2:

#' Fips state
#' @name fips.state
#' @export
"fips.state"

然后在你自己的包中,你可以简单地@importFrom acs fips.state