【问题标题】:R package data not available when importing in another package在另一个包中导入时,R 包数据不可用
【发布时间】:2019-05-02 02:31:17
【问题描述】:

我有一个“测试”包,其中数据对象“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

其实我并没有直接使用,而是在另一个包 testingtop 中导入了这个函数:

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

    hello()
}

我在说明的导入部分进行了测试,但失败了。

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的副本

【问题讨论】:

    标签: r namespaces package


    【解决方案1】:

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

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

    把数据放到内部数据文件中让我的函数 hello2() 看到了

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-01
        • 1970-01-01
        • 2020-02-24
        • 1970-01-01
        • 2018-03-20
        • 1970-01-01
        • 2019-11-08
        相关资源
        最近更新 更多