微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在另一个包中使用R包中的“未导出”数据集

如何解决如何在另一个包中使用R包中的“未导出”数据集

我正在使用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.

如您所见,功能失败,并带有更多可理解的错误消息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。