我有一个很长的计算,我试图使用未来的包(特别是在一个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)
答案 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`) })
当然不是两者。