R包数据在另一个包中导入时不可用

时间:2018-11-29 23:16:11

标签: r namespaces package

我有一个“测试”包,数据对象“ test_data”保存在数据文件夹中,文件名为“ test_data.RData”。

测试包含一个使用此数据对象的函数hello()

#' hello
#'
#' @return Prints hello "your_name"
#' @export
#'
#' @examples
#' hello()
hello <- function(your_name = "") {

    print(paste("test_data has", nrow(test_data), "rows"))
    print(sprintf("Hello %s!", your_name))
}

以下代码可以正常工作:

require(testing)
testing::hello()
[1] "test_data has 32 rows"
[1] "Hello !"

但这失败了:

testing::hello()
Error in nrow(test_data) : object 'test_data' not found

实际上,我不是直接使用它,而是在另一个导入了此功能的测试包中使用它:

#' Title
#'
#' @export
#' @importFrom testing hello
hello2 <- function(){

    hello()
}

我在Description的Imports部分进行了测试,但失败了。

require(testingtop)
testingtop::hello2()
Error in nrow(test_data) : object 'test_data' not found

如果我将其放在Depends中,则当我使用library()加载程序包时,它将起作用 否则它仍然会失败:

> library(testingtop)
Loading required package: testing
> testingtop::hello2()
[1] "test_data has 32 rows"
[1] "Hello !"

Restarting R session...

> testingtop::hello2()
Error in nrow(test_data) : object 'test_data' not found

如果它是函数而不是数据对象,则导入会很好,为什么它与数据对象不同,我需要加载导入的包?我错过了什么?它与LazyData和LazyLoad有关吗?

可能是this question的副本

2 个答案:

答案 0 :(得分:1)

补充 Benoit 的回答。我基本上有这个问题,但是当使用我的包数据作为函数参数的默认值时。在这种情况下,?data 帮助文件中有一个第三解决方案:“在包使用延迟加载数据集作为函数的默认参数的异常情况下,需要由 :: 指定,例如,survival::survexp.us。"

这第三种方法为我解决了这个问题。 (但我通过 Benoit 的链接找到了它。)

答案 1 :(得分:0)

所以我想我已经从数据函数?data的文档中找到了解决方案

  

在没有envir参数的函数中使用数据几乎总是具有将对象放置在用户工作空间中的副作用(实际上,替换已存在该名称的任何对象)。最好总是通过data(...,envir = environment())将对象放入当前评估环境中。但是,通常最好选择两种选择,两者都在“ Writing R Extensions”手册中进行了说明。   对于数据集,请设置一个程序包以使用数据的延迟加载。   对于系统数据对象,例如函数中用于计算的查找表,请在包源中使用文件“ R / sysdata.rda”,或在包安装时通过R代码创建对象。   有时一个重要的区别是,第二种方法将对象放置在名称空间中,而第一种则没有。 因此,如果将函数mytable从包中视为对象很重要,则它是系统数据,应使用第二种方法。

将数据放入内部数据文件使我的函数hello2()看到

> testingtop::hello2()
[1] "test_data has 32 rows"
[1] "Hello !"