Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何异步处理knitr代码块?_R_R Markdown_Knitr_R Future - Fatal编程技术网

如何异步处理knitr代码块?

如何异步处理knitr代码块?,r,r-markdown,knitr,r-future,R,R Markdown,Knitr,R Future,我想知道是否有一种方法可以异步处理RMarkdown文档中的knitr代码块 我想到的是:假设一个文档包含一个复杂的数据分析,它被分解成几个代码块,其中几个代码块包含复杂的代码,因此运行缓慢。这些代码块彼此之间没有任何依赖关系,它们的输出要么是一个绘图、一个表,要么是一些其他数值结果,而不是任何其他代码块使用的任何数据对象 如果我能并行处理这些代码块,那就太好了。通常,knitr按顺序处理每个代码块,因此,在处理速度较慢的代码块后面的队列中可能有多个代码块。像future和promises这样的

我想知道是否有一种方法可以异步处理RMarkdown文档中的knitr代码块

我想到的是:假设一个文档包含一个复杂的数据分析,它被分解成几个代码块,其中几个代码块包含复杂的代码,因此运行缓慢。这些代码块彼此之间没有任何依赖关系,它们的输出要么是一个绘图、一个表,要么是一些其他数值结果,而不是任何其他代码块使用的任何数据对象


如果我能并行处理这些代码块,那就太好了。通常,knitr按顺序处理每个代码块,因此,在处理速度较慢的代码块后面的队列中可能有多个代码块。像futurepromises这样的R包支持异步编程,我想知道是否可以利用它以同样的方式并行处理knitr代码块。我知道我可能会将慢代码块放在单独的Rmd文件中,然后在
future::future_map
调用中的代码块调用
knitr::knit_child
,但最好将所有内容都放在同一个文件中。我还知道,可以在代码块中使用
child
选项指定子文档。此外,我知道我可以通过使用
ref.label
选项按名称调用代码块来重用代码块。所以我想知道的是,是否有任何方法可以劫持这些功能(可能使用future),从而在执行传递到后续代码块时延迟呈现代码块输出。或者类似的。仅仅是探索超越knitr中代码块顺序计算的可能性空间,并使用多核或多段处理。

这是一个有趣的想法。不过,我不确定这是问这个问题的最好地方。我相信解决这个问题的办法是使用{drake}。也许你应该联系{knitr}、{future}和{drake}的作者,告诉他们你的想法。代码块的顺序过程确保了Rmarkdown文档的可复制性。据我所知,R本质上是单线程的,所以…*knitr Github页面明确指出我应该发布到so,并等待24小时,然后将问题发布到Github*我将调查drake;谢谢!*是的,顺序处理确保了再现性,但是如果块彼此独立并且没有下游效应,原则上没有理由不能异步处理它们,如果仔细处理的话*R是单线程的,但是像future和Promissions这样的包支持多核和多段处理,所以这不是一个拦截器,我是英国人,请不要把我的帖子编辑成美国英语,谢谢!我认为这是不可能的(至少在没有大量黑客攻击的情况下)。基本上,knitr计算块(或重复缓存内容),然后打印结果。如果块是异步计算的,那么在编写任何输出之前,必须首先计算所有代码。这在结构上是非常不同的,IMO。一个hack-y解决方案可以
purl
当前文档(以及所有相关的警告!),将结果按块分割,使用您选择的并行化工具评估其内容,最后(以某种方式)以knitr[cont.]的方式保存并行化评估的输出。。。[cont.]将其识别为缓存。所有这些都应该在第一块中发生。然后,可以使用先前生成的缓存定期继续评估。但这有很多缺点和先决条件,所以我不建议尝试。祝你好运