【问题标题】:error loading package inside foreach when using testthat使用 testthat 时在 foreach 中加载包时出错
【发布时间】:2021-07-05 12:57:38
【问题描述】:

我正在尝试使用带有 testthat 的单元测试来调试问题。如果手动运行代码运行良好,但似乎在运行test() 时,foreach 内的工作人员似乎无法访问我正在测试的包内的包或函数。代码非常复杂,所以我没有一个很好的工作示例,但这里是结构的概要:

tests/testthat 中的单元测试:

test_that("dataset runs successful", {
  expect_snapshot_output(myFunc(dataset, params))
})

MyFunc 调用另一个 func,并在该 func 内部创建工作人员来运行一些代码:

final_out <- foreach(i = 1:nrow(data), 
    .combine = c, 
    .export = c("func1", "func2", "params"),
    .packages = c("fields", "dplyr")) %dopar% {
    output = func1(stuff)
    more = func2(stuff)
    out = rbind(output, more)
    return (out)
}

工人似乎无法访问func1func2 等。

我尝试将包的名称添加到这一行的包中,但它也不起作用。

有什么想法吗? 正如我所提到的,这只是尝试运行单元测试时的一个问题,我怀疑它与我正在测试的包的加载方式有关?

【问题讨论】:

    标签: r unit-testing foreach testthat


    【解决方案1】:

    当工人启动时,他们没有正常会话所拥有的全套包;当测试在本地会话中运行时,将搜索路径中包的所有包名称传递给 .packages 参数。

    【讨论】:

    • 谢谢,我认为这可能是问题所在,但是当我尝试传递我正在测试的包的名称(它是我们开发的包)时,它说找不到包。 Func1、Func2 等是该软件包的一部分。我还尝试调整内部代码以指定例如:MyPackage::Func1,但这也不起作用。
    • 您在使用多个库吗?可能是工作人员会话没有选择替代库?您可以尝试在函数中设置硬编码库路径,看看是否可以解决。
    • 似乎没有加载的包是我开发的包,我正在尝试对其进行单元测试。我不知道当 devtools::test() 运行时为它创建的库路径在哪里创建,然后可供工作人员使用?
    • 实际上我认为这是全局环境加载各种东西的问题.. 使用干净的环境,将包名称添加到 .packages 后,一切正常!
    猜你喜欢
    • 2016-05-11
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多