问题描述
我正在使用wpp2019
软件包,该软件包包含许多人口统计数据集。我希望能够在我包中的某些函数中使用这些数据集。不幸的是,这些数据集不能用get
(或wpp2019::
)来引用,而只能通过data
来引用。
由于wpp2019
的重点是要成为 data 包,因此,我不愿在内部保存数据并在本地引用它。尽管此question暗示了我想要的内容,但OP并没有只能通过data
导出数据的问题。
我在代码中一直使用data("name of data",package = "wpp2019)
,但devtools::check()
却通过no visible binding for global variable 'name of data'
发出了尖叫。
有人知道解决方法吗?
解决方法
我不确定为什么会出现此错误。我创建了一个仅包含以下功能的小型测试包,并检查运行情况,没有任何问题:
#' Loads random dataset from wpp2019
#'
#' @export
#'
#' @importFrom utils data
load_random_data <- function() {
# check if package is installed
if (requireNamespace("wpp2019",quietly = TRUE)) {
# get name of random dataset
rand <- sample(data(package = "wpp2019")[["results"]][,3],1)
x <- utils::data(list = rand,package = "wpp2019",envir = environment())
return(get(x))
} else {
stop("Install package from https://github.com/PPgp/wpp2019 first.")
}
}
我发现data
评估数据集名称的方式有些混乱。因此,示例功能可能有助于清除问题。
@ user2554330促使我编写一个更通用的函数来从包中加载数据集。因此,这里有一些额外的花哨:
#' Load dataset from from a package
#'
#' @param title character. Title of a dataset in the package
#' @param package character. Name of a package in which the dataset is present.
#'
#' @export
#'
#' @importFrom utils data
load_data <- function(title,package = "wpp2019") {
# check if package is installed
if (requireNamespace(package,quietly = TRUE)) {
# check if dataset is in the package
if (title %in% data(package = package)[["results"]][,3]) {
return(get(utils::data(list = title,package = package,envir = environment())))
} else {
stop("Dataset '",title,"' not found in package ",package,".")
}
} else {
stop("Package '","' not installed.")
}
}
然后快速测试是否可行:
dat <- load_data("UNlocations")
ncol(dat)
#> 32
load_data("UNLocations")
#> Error in load_data("UNLocations"): Dataset 'UNLocations' not found in package wpp2019.
load_data("UNLocations","not_installed")
#> Error in load_data("UNLocations","not_installed"): Package 'not_installed' not installed.
如您所见,功能失败,并带有更多可理解的错误消息。