什么是 furrr "black magic?"

What is furrr's "black magic?"

我使用 R 包 furrr 来满足我的大部分并行化需求,并且基本上从我的全局环境导出东西到集群时从来没有问题。今天我做了,我不知道为什么。包文档似乎将全局变量发送到集群的过程描述为 "black magic." 什么是黑魔法?

furrr::future_options 文档说:

Global variables and packages By default, the future package will perform black magic to look up the global variables and packages that your furrr call requires, and it will export these to each worker. However, it is not always perfect, and can be refined with the globals and packages arguments.

作为次要问题:是否有一种优雅的方式告诉它执行它的黑魔法,但导出它遗漏的东西?或者,选择 a) 都是黑魔法,还是 b) 在 .options 参数中对所有内容进行硬编码?

这并没有完全回答问题,但我认为它为您指明了正确的方向。来自 this intro vignette 的“全局变量”部分:

It does this with help of the globals package, which uses static-code inspection to identify global variables. If a global variable is identified, it is captured and made available to the evaluating process.

还有 this "Common Issues with Solutions" vignette(@michael 在上面提供了有用的链接)讨论了全局包中静态代码 eval 导致的一些常见“问题”。

我找到了这里,因为我的 future_map() 代码无法找到我在 glue() 调用中引用的变量。那个小插图准确地解释了为什么会发生这种情况。

至于为什么您的代码有时有效有时无效,很难说。但是正如您所看到的,幕后发生的事情非常复杂,如果一些看似无关的更改破坏了某些东西,我并不感到惊讶。 (对我而言,此更改是清理我的代码并使用 glue 而不是 paste :shrug:)