导入另一个包时,导入的 R 包数据不可用

4
我有一个名为“testing”的包,其中包含一个名为“test_data”的数据对象,保存在文件夹"data"下,文件名为"test_data.RData"。
testing包中包含一个函数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

实际上我并没有直接使用它,而是在另一个引用了这个函数的包testingtop中使用:

#' 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有关吗?
可能是这个问题的重复。
2个回答

2
补充Benoit的回答。我基本上也遇到了这个问题,但是当将我的包数据作为函数参数的默认值时。在这种情况下,在?data帮助文件中有一个第三种解决方案:“在不寻常的情况下,如果一个包使用惰性加载的数据集作为函数的默认参数,那么需要通过::指定,例如survival::survexp.us。”
这第三种方法对我很有用。(但我是通过Benoit的链接找到它的。)

2

因此,我认为我已经从data函数的文档中找到了解决方案?data

在函数中使用数据而没有envir参数几乎总是会产生不良副作用,即将对象放入用户的工作空间中(实际上,替换任何同名的对象)。通过 data(..., envir = environment()) 将对象放入当前评估环境通常更好。然而,在“编写R扩展”手册中通常有两种更好的选择。 对于数据集,设置一个包以使用数据的惰性加载。 对于系统数据的对象,例如在函数内部计算中使用的查找表,使用包源代码中的文件“R/sysdata.rda”,或者在包安装时通过R代码创建对象。 有时一个重要的区别是第二个方法将对象放置在命名空间中,而第一个不会。因此,如果函数从包中看到mytable作为对象很重要,则它是系统数据并且应该使用第二种方法。

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

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

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