R - 用于在命令系统评估中使用sprintf函数的循环

时间:2014-10-19 21:16:34

标签: r batch-file for-loop printf batch-processing

我想使用批处理文件运行一些文件,这些文件将使用for循环从R执行。举个例子,假设我有2个我想要执行的运行:

runs <- c(102, 103)

系统命令的语法要求首先指定批处理文件,然后是运行的输入数据文件(102.txt103.txt)以及输出结果文件的名称。批处理文件已执行(102.res103.res)。我试图使用for循环运行它:

for (r in runs) {
   cmd <- sprintf('C:/example1/test.bat %d.txt %d.res', runs, runs)[1]
   print(eval(cmd))
   command: system(cmd)
}

[1] "C:/example1/test.bat 102.txt 102.res"

不幸的是,这只会执行第一次运行(102)而不会进入下一次运行(103)。 R控制台显示以下警告:

Error in command:system(cmd) : NA/NaN argument

认为此错误阻止了R进入下一次运行,我试图在for循环中使用options(warn = -1)

for (r in runs) {
   options(warn = -1)
   cmd <- sprintf('C:/example1/test.bat %d.ctl %d.res', runs, runs)[1]
   print(eval(cmd))
   command: system(cmd)
   options(warn = 0)
}

不幸的是,这继续引发同样的错误。对于它的价值,我的批处理文件(102.res)的输出正是我想要的,我只是希望能够绕过这个错误并继续我的其余运行。有关如何最好地做到这一点的任何想法?

提前致谢。

1 个答案:

答案 0 :(得分:2)

这是你拥有的

runs <- c(102, 103)
for (r in runs) {
  cmd <- sprintf('C:/example1/test.bat %d.txt %d.res', runs, runs)[1]
  print(eval(cmd))
#  command: system(cmd)
}

输出

[1] "C:/example1/test.bat 102.txt 102.res"
[1] "C:/example1/test.bat 102.txt 102.res"

尝试使用循环变量r而不是数组,在cmd&lt; -... line

中运行
for (r in runs) {
   cmd <- sprintf('C:/example1/test.bat %d.txt %d.res', r, r)[1]  # <- change runs to r
   print(eval(cmd))
#  command: system(cmd)
}

输出

[1] "C:/example1/test.bat 102.txt 102.res"
[1] "C:/example1/test.bat 103.txt 103.res"