【问题标题】:How can I load dependencies in an R package?如何在 R 包中加载依赖项?
【发布时间】:2017-09-18 23:01:43
【问题描述】:

我正在开发一个 R 包,可以在 DESCRIPTIONS 文件中找到它

Imports: 
    dplyr,
    ggplot2,
    ncdf4

我有一个使用第三个依赖项的示例函数

testFun <- function(file, lat, long){
  ncfname <- file.path(file,fsep = .Platform$file.sep)
  xfile <- nc_open(ncfname) #Opens the NetCDF file
  lat <- ncvar_get(xfile, 'lat') #Extracts all latitudes

  ...Calculations

  return(XYZ)
}

当我Build and Reload 包并运行该函数时,它是could not find function "nc_open"

但是,当我用 ncdf4::nc_open 替换它时它可以工作

我应该在代码中使用的每个依赖项前加上 packagename:: 前缀吗?还是我错过了什么?

通常,我希望从DESCRIPTIONS 安装所有依赖项,并且它的功能可以使用,而无需每次都需要包前缀。

【问题讨论】:

    标签: r package cran


    【解决方案1】:

    要么:

    • 明确地在函数前面加上它来自的包:ncdf4::nc_open(...)

    或者:

    • 在您的 NAMESPACE 文件中添加一行 importFrom(ncdf4, nc_open),然后在您的代码中,调用不带包的函数:nc_open(...)

    除了为要导入的每个函数添加 importFrom 行之外,您还可以使用 import(ncdf4) 来获取该包中的所有内容。

    【讨论】:

    • 我认为显式前缀甚至可能有助于代码清晰。所以我会保持简单并坚持下去。我不想维护另一个进口清单。
    • 您不需要为每个函数提供importFrom(),每个包只需要一个:importFrom(ncdf4, nc_open, nc_close, nc_foo, nc_bar)
    • @hong 导入部分包与整个包相比有什么好处?无论如何都重要吗?我可以只做 import() 而不必担心 importFrom 但我想知道它在计算、大小等方面的影响。
    • 我插入了 import(ggplot2)、重建、重新启动等,但似乎没有影响。而且错误和以前一样。有什么想法吗?
    【解决方案2】:

    最简单也是最正确的方法是直接从包中提取你的函数,而不打开任何可能会破坏某人当前环境的包。

    试试这个:

    xfile <- ncdf4::nc_open(ncfname)
    

    它应该可以访问您需要的内容而不会发生冲突。这是当前首选的方法,因为它会为您的用户留下找到的东西。它还让人们很容易知道他们应该去探索会发生什么。

    【讨论】:

    • 如果可能的话,我想立即提供参考。它在任何文档中都可用吗?这看起来很麻烦,但更安全。
    • 转到 Hadley WIckam 的网站 r-pkgs.had.co.nz/namespace.html,它清楚地指出,除非您使用的大部分包(如许多数据库包,其功能 OVER DBI 执行)都首选 ::。
    猜你喜欢
    • 2016-09-30
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2014-04-29
    • 2010-09-15
    相关资源
    最近更新 更多