【问题标题】:R package build, reason for "object 'xxx' not found"R包构建,“找不到对象'xxx'的原因”
【发布时间】:2017-08-24 20:01:19
【问题描述】:

我正在尝试从在包外工作的代码构建一个 R 包。我的第一次尝试是相当复杂的嵌套函数,最终使用 doMPI 和 foreach 进行并行处理。还在 Ubuntu 16.04 上使用 RStudio 1.01.43。我构建了软件包并且工作正常。然后,当我尝试运行调用 next 的顶级函数时,它会引发错误:

Error in { : task 6 failed - "object 'RunOys' not found" 

我在调用顶级函数之前手动设置布尔变量 RunOys=TRUE,当它下降到为 ifelse 语句调用此变量的那个时,它会失败。在调用顶级函数之前,我检查 globalenv() 和

> RunOys
[1] TRUE

在 foreach 并行代码中,我有这个语句,它在编译成 R 包之前一直有效:

FinalCalcs <- function (...) {
    results <- data.frame ( foreach::`%dopar%`(
             foreach::`%:%`(foreach::foreach(j = 1:NumSim, .combine = acomb,
                                             .options.mpi=opts1),
                            foreach::foreach (i = 1:PopSize, .combine=rbind,
                                    .options.mpi=opts2,
                                    .export = c(ls(globalenv())),
                                    .packages = c("zoo", "msm", "FAdist", "qmra"))),
                            {

它应该将 globalenv() 中的所有对象导出到每个从站。

我不明白为什么有些变量似乎被传递了,而其他变量却没有。我是否需要在文件中为调用它的函数明确指定它为@param?

【问题讨论】:

  • 如果你想超级脏,试试.export = c(ls(globalenv(), ls(environment()), ls(parent.frame()))

标签: r foreach roxygen2


【解决方案1】:

使用foreach,更好的是让所有需要的变量都存在于调用foreach 的同一环境中。所以基本上,我总是在函数内部使用foreach,并将foreach 中需要的所有变量传递给这个函数。

就好像foreach 看不到它的调用函数一样。你不需要导出任何东西。对于函数,请使用package::function(就像在包中一样,这样您就不需要@import 包)。

【讨论】:

  • 你知道这个的一个小例子吗?该模型需要大约 60 个参数值,并且可能会增加。我还希望所有参数值都具有默认值,但能够在调用顶级函数时更改其中的任何一个或全部。谢谢
  • 60 个参数对于函数来说是不合理的。您可以将它们分解为例如列表?
  • 我当然可以将它们分类到列表中,每个函数一个。然后我可以将它们用作顶级函数的参数吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多