【问题标题】:Writing R packages: how to import another package?编写 R 包:如何导入另一个包?
【发布时间】:2014-08-13 12:31:39
【问题描述】:

作为一个最小的工作示例,我正在尝试将 MASS 包中的一些对象导入我自己的包(称为 Test) - 以 abbey 数据集为例:

### In R/Test.R:
#' @import MASS
abbey     # Check that the dataset has been imported OK

### DESCRIPTION:
Package: Test
...
Imports: MASS

### NAMESPACE:
# Generated by roxygen2 (4.0.1): do not edit by hand
import(MASS)

我在 RStudio 中点击 Build & Reload 并得到错误:

==> devtools::document(roclets=c('rd', 'collate', 'namespace'))

Updating Test documentation
Loading Test
Error in eval(expr, envir, enclos) : object 'abbey' not found
Writing NAMESPACE
Documentation completed

==> Rcmd.exe INSTALL --no-multiarch --with-keep.source Test

* installing to library '.../R/R-3.1.0/library'
* installing *source* package 'Test' ...
** R
** preparing package for lazy loading
Error in eval(expr, envir, enclos) : object 'abbey' not found
Error : unable to load R code in package 'Test'
ERROR: lazy loading failed for package 'Test'
* removing '.../R/R-3.1.0/library/Test'
* restoring previous '.../R/R-3.1.0/library/Test'

Exited with status 1.

好像连最基本的import都失败了——系统找不到abbey。显然,我一定忽略了一些明显的事情——出了什么问题?

【问题讨论】:

  • 在我看来,@import MASS 仅使 MASS 中的函数在当前搜索路径上可见。您可以使用MASS::abbey 访问此变量。官方手册“编写 R 扩展”中有相当长的“包命名空间”部分——这些命名空间的东西似乎很棘手。
  • 出于好奇,你试过#' importFrom MASS abbey吗?
  • @GSee 否 - 我只是在测试 Imports 是否会按预期工作,然后卡住了……现在看看
  • @MiloChen 作为旁注,我对导入整个命名空间有意见,可能会或可能不会被其他人共享:stackoverflow.com/a/18403565

标签: r import package


【解决方案1】:

根据我的尝试: 您不能导入 abbey,因为它不是 MASS 导出的。

> library(MASS)
> 'abbey' %in% getNamespaceExports(getNamespace('MASS'))
[1] FALSE

abbey 是一个包数据集,由 data/abbey.rda 文件定义,而不是包定义的常规符号名称。

按照建议,您应该只使用 MASS::abbey,甚至添加 R/data.R:

abbey <- MASS::abbey

在安装时复制你的包命名空间中的数据集。

【讨论】:

    猜你喜欢
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2019-11-08
    • 2019-05-02
    • 2016-08-23
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多