抑制R中的静态代码检查(未来包)

时间:2018-04-07 18:24:36

标签: r parallel-processing dplyr future static-code-analysis

我有一个很长的计算,我试图使用未来的包(特别是在一个R闪亮的应用程序中)并行化。

我已经使用dplyr包进行所有数据操作,并且有很多列名称没有引用引号。当我尝试运行我知道在非并行化时工作的函数时,我收到以下错误:

Warning: Error in : Identified global objects via static code inspection ({if (i > maxProgress) {; maxProgress <- i; shinyWidgets::updateProgressBar(session = session, id = "pb",; value = 100 * i/length(scanList)); ...; }; return(resultInstance); }). Failed to locate global object in the relevant environments: ‘Months in Service’

因为静态代码检查认为'Months in Service'是一个全局变量并且无法找到它(它实际上是dplyr tibble的列名),所以它永远不会运行我的代码。

如果我在调用函数之前全局执行以下操作:

`Months in Service` <- NULL

它为另一个列名称提供了相同的错误。因此,一种解决方案是将每个名称定义为全局变量,并希望dplyr的工作方式相同。然而,有另一种简单的方法可以解决这个问题,例如告诉R评估所有内容,就像没有并行化一样(每次迭代完全独立)

编辑1:我简化了操作并测试了NULL是否真的有效。它没有,它会抱怨,因为它认为列名是NULL,例如:

no applicable method for 'rename_' applied to an object of class "NULL"

编辑2:示例复制

 library("dplyr")
 library("listenv")

  exampleTibb <- tibble(`col 1`=c(1,2,3))
  exampleFuture <- listenv()
  exampleFuture[[1]] %<-% future({ rename(exampleTibb, `col 2` = `col 1`) })
  exampleFuture <- as.list(exampleFuture)

1 个答案:

答案 0 :(得分:3)

future软件包的作者:这是因为bug已针对将来的1.8.0进行了修复。我准备把这个提交给CRAN,但同时你可以这样做:

options(future.globals.onMissing = "ignore")

或者,更好的是,安装develop版本:

remotes::install_github("HenrikBengtsson/future@develop")

更新2018-04-08:未来1.8.0现在在CRAN上。

更新2018-04-07:仅在使用嵌套期货时才会出现此错误。请注意,当您同时使用%<-%future()时,会错误地引入嵌套的期货。这显然是一个错误。您想要使用:

exampleFuture[[1]] %<-% { rename(exampleTibb, `col 2` = `col 1`) }

exampleFuture[[1]] <- future({ rename(exampleTibb, `col 2` = `col 1`) })

当然不是两者。