编写R包:如何导入另一个包?

6

作为一个极简工作示例,我正在尝试从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中点击 构建和重新加载,但是出现了错误:

==> 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 来访问此变量。在官方手册 "Writing R extensions" 中有一个相当长的章节介绍“包命名空间” - 这些命名空间似乎相当棘手。 - Patrick Roocks
你尝试过 #' importFrom MASS abbey 吗? - GSee
@GSee 不,我只是在测试“导入”是否能够如预期般工作,并且卡在那里了...现在会去看看。 - mchen
1
@MiloChen 作为一种附注,我对导入整个命名空间有一些看法,这可能或可能不会被其他人分享:https://dev59.com/0mMl5IYBdhLWcg3wgnOl#18403565 - GSee
1个回答

1
根据我的尝试: 你无法导入abbey,因为它没有被MASS导出。
> library(MASS)
> 'abbey' %in% getNamespaceExports(getNamespace('MASS'))
[1] FALSE

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

建议您只使用MASS::abbey,甚至可以在R/data.R中添加:

abbey <- MASS::abbey

在安装时将数据集复制到您的软件包命名空间中。


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