如何在R包中加载依赖项?

3

我正在开发一个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)
}

当我构建并重新加载软件包时,运行函数时会出现“找不到函数“nc_open”"的错误。
但是,当我将其替换为“ncdf4 :: nc_open”时,它可以正常工作。
我是否应该在代码中为每个依赖项添加“packagename ::”前缀?还是我遗漏了什么?
通常,我希望所有依赖项都从“DESCRIPTIONS”中安装,并且可以在不需要每次都要求软件包前缀的情况下使用其功能。
2个回答

7
要么:显式地在函数前缀中加上它所属的包名:ncdf4::nc_open(...) 要么:在你的NAMESPACE文件中添加一行importFrom(ncdf4, nc_open),然后在你的代码中,调用该函数时不需要带上包名:nc_open(...) 如果你想导入多个函数,而不是为每个函数都添加一个importFrom行,你也可以使用import(ncdf4)来从该包中获取所有内容。

我认为显式前缀甚至可以帮助代码的清晰度。因此,我会保持简单并坚持使用它。我不想维护另一个导入列表。 - maximusdooku
你不需要为每个函数都使用importFrom(),只需要为每个包使用一次:importFrom(ncdf4, nc_open, nc_close, nc_foo, nc_bar) - Joshua Ulrich
@hong 导入包的部分与整个包相比有什么好处?这在任何方面都有影响吗?我可以只使用import()而不必担心importFrom,但我想知道它对计算、大小等方面的影响。 - maximusdooku
我尝试了插入import(ggplot2),重新构建,重启等操作,但似乎没有影响。而且错误与之前相同。您有任何想法吗? - maximusdooku

1
最简单且正确的方法是直接从包中提取您的函数,而不打开可能会破坏某人当前环境的任何包。
试试这个:
xfile <- ncdf4::nc_open(ncfname)

它应该在没有冲突的情况下访问您所需的内容。这是当前首选方法,因为它将事物保留为用户发现它们的状态。这也使得人们很容易知道发生了什么,如果他们去探索。


如果可能的话,我想要一个证明这是正确的方式的参考。它是否在任何文档中可用?尽管更加繁琐,但似乎更安全。 - maximusdooku
前往Hadley Wickam的网站http://r-pkgs.had.co.nz/namespace.html,它明确指出,除非您正在使用大部分包(例如许多数据库包,其功能在DBI上执行),否则建议使用::。 - sconfluentus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接