我遇到了这个问题,但我怎么也不知道该怎么解决。
示例前的快速总结:
我有几百个数据集,我想每天创建报告。为了有效地完成这个任务,我将这个过程与doParallel
并行化。在RStudio中,这个过程工作得很好,但是当我试图在windows上通过任务调度程序使这个过程自动化时,我似乎不能让它工作。
RStudio中的进程是:
我调用了一个脚本,它是我所有其他脚本的来源,每个单独的脚本都有一个执行适当的包导入的头部分,因此,例如,它看起来像:
get_files <- function(){
get_files.create_path() -> path
for(file in path){
if(!(file.info(paste0(path, file))[['isdir']])){
source(paste0(path, file))
}
}
}
get_files.create_path <- function(){
return(<path to directory>)
}
#self call
get_files()
这将是简单的"Source on saved"并把我需要的一切都带进.GlobalEnv
。
从那里,我可以简单地键入:parallel_report()
,它调用一个脚本,该脚本来源另一个脚本,该脚本包含报告代的并行化。有一个问题,只是直接调用并行化(我想知道这是否相关?),所以我不得不使doParallel
脚本一个非功能的住房脚本,因此不能引入get_files
脚本,每次我把所有东西都带进来,就会开始报告生成。因此,我必须将它包含在自己的脚本中,并将其保存在其他地方,以便在必要时调用。parallel_report()
函数就是:
parallel_report <- function(){
source(<path to script>)
}
那么被引用的脚本就是真正的并行化脚本,看起来像这样:
doParallel::registerDoParallel(cl = (parallel::detectCores() - 1))
foreach(name = report.list$names,
.packages = c('tidyverse', 'knitr', 'lubridate', 'stringr', 'rmarkdown'),
.export = c('generate_report'),
.errorhandling = 'remove') %dopar% {
tryCatch(expr = {
generate_report(name)
}, error = function(e){
error_handler(error = e, caller = paste0("generate report for ", name, " from parallel"), line = 28)
})
}
doParallel::stopImplicitCluster()
generate_report
函数只是一个。rmd和render()
调用者:
generate_report <- function(<arguments>){
#stuff
generate_report.render(<arguments>)
#stuff
}
generate_report.render <- function(<arguments>){
rmarkdown::render(
paste0(data.information@location, 'report_generator.Rmd'),
params = list(
name = name,
date = date,
thoughts = thoughts,
auto = auto),
output_file = paste0(str_to_upper(stock), '_report_', str_remove_all(date, '-'))
)
}
在RStudio中,我将简单地执行以下操作:
1 -源保存脚本带来的一切
2 - typeparallel_report
2。a -直接调用generate_report
的doParallization
2。b -generate_report
调用.Rmd
文件,该文件包含生成报告所需的函数调用和其他内容
过程开始并顺利完成。
为了通过任务调度程序使情况自动,我制作了一个任务调度程序可以调用的脚本,命名为automatic_caller
:
source(<path to the get_files script>) # this brings in all the scripts and data into the global, just
# as if it were being done manually
tryCatch(
expr = {
parallel_report()
}, error = function(e){
error_handler(error = e, caller = "parallel_report from automatic_callng", line = 39)
})
error_handler
函数只是一个内部脚本,用于记录整个过程中的错误。
因此,在任务时间表的任务中,我调用Rscript.exe
,然后调用automatic_caller
。automatic_caller
函数中的所有内容都可以工作,除了报表生成。这个过程几乎是自动完成的,我得到的唯一输出是一个错误:
"pandoc version 1.12.3 or higher is required and was not found (see the help page ?rmarkdown::pandoc_available)."
但是rmarkdown
是在doParallel
和的.export
调用中,它是在脚本中显式使用的,和在实际的generate_report
中,它是直接通过rmarkdown::render()
调用的。
所以-我完全不知所措。
如果你有什么想法和建议,我将不胜感激。
所以pandoc是一个可以帮助文件从一个扩展名转换到另一个扩展名的可执行文件。RStudio自带了自己的pandoc可执行文件,所以当从RStudio运行脚本时,它知道在需要pandoc时指向哪里。
从命令提示符,系统不知道查看RStudio内部,所以简单地下载pandoc作为一个独立的可执行文件给系统适当的指针。
下载pandoc,一切正常。