我正在R脚本中执行批处理文件。我想使用foreach循环两次运行这个和R脚本的另一个大部分。
foreach (i=1:2, .combine = rbind)%do%{
shell.exec("\\\\network\\path\\to\\batch\\script.ext")
*rest of the R script*
}
但一个愚蠢的问题是这个批处理文件生成数据,并且数据连接到循环内的SQL Server localdb。我一开始认为脚本会执行批处理文件,等待它完成然后再继续。但是,(后见之明似乎很明显)脚本执行批处理文件,尝试获取尚未创建的数据(因为文件未完成运行)并在第一次完成之前再次执行批处理文件
我一直试图找到延迟执行脚本的其余部分,直到批处理脚本完成执行但还没有提出任何东西。我很感激任何人的见解。
答案 0 :(得分:1)
Windows用户可能会使用shell
,默认情况下会wait=TRUE
,这会导致R等待其完成。您可以选择是否直接“实习”结果。
在类似unix的系统上,使用system
,默认为wait=TRUE
。
如果您的批处理文件只是启动另一个进程并终止,则可能需要将其修改为等待完成或返回可以监视的合适进程或文件指示符。
答案 1 :(得分:1)
使用system2
代替shell.exe
。 system2
调用是阻塞的 - 意思是,该函数等待外部程序运行完毕。在大多数系统上,这可以直接用于运行脚本。在Windows上,您可能必须调用rundll32
来执行脚本:
cmd = c('rundll32.exe', 'Shell32.dll,ShellExecute', 'NULL', 'open', scriptpath)
system2(paste(shQuote(cmd), collapse = ' '))