zl程序教程

您现在的位置是:首页 >  其他

当前栏目

批量运行多个R脚本并打印运行状态

2023-03-07 09:47:14 时间

曾老师曾经有一篇推文《批量运行多个R脚本》,介绍了批量运行R脚本的思路,同时也提出了一些问题,今天就这个学徒作业,我们来探究一下。

首先前往github[1]下载R脚本。

打开以后可以发现这里有19个R脚本,如果把这些R代码文件一个个打开再运行,无疑增加了很多工作量。

首先在「KOR_HCC-main/code」文件夹中新建一个R project,然后在「KOR_HCC-main」文件夹下新建一个「results」目录。曾老师提供的代码是

fs=list.files('./',pattern = '*.R$')
fs
lapply(fs, function(x){
  print(x)
  source(x)
}) 

这个代码有一个小问题,即有一些脚本可能由于缺包或者里面有小bug,就会导致报错退出循环。

实测在我的R环境下,运行到第3个代码遇到了报错,此时Fig 1A和Fig 1B的结果已经产生。

这个时候我们希望脚本继续运行,同时打印各个脚本的运行情况。

我们参考教程R语言tryCatch使用方法:判断Warning和Error[2]和中断运行 r 忽略报错 继续运行[3](这个教程中的代码有些问题,需要自己修改调试),使用「tryCatch」来解决这个问题。

tryCatc帮助文档

result = tryCatch({
   #正常的逻辑
    expr}, 
  warning = function(w) {
   #出现warning的处理逻辑
   warning-handler-code}, 
  error = function(e) {
   #出现error的处理逻辑
   error-handler-code}, 
  finally = {
   #不管出现异常还是正常都会执行的代码模块,
   #一般用来处理清理操作,例如关闭连接资源等。
   cleanup-code}

第一次学习tryCatch,经过反复调试,修改代码为

fs=list.files('./',pattern = '*.R$');fs
for (i in fs){tryCatch(
  {source(i)},
  warning = function(i){message("warning @ ",i);return(NA)}, 
  error = function(i){message("error @ ",i);return(NA)},
  finally = function(i){message("next......")}
    )}

运行结果如下

发现很多由于包缺失造成的报错,同时也生成了更多的结果文件。

接下来我们来统一安装这些缺失的R包,并使用library检验是否成功安装。

BiocManager::install(c("GGally","Rtsne","RGtk2","dendsort","monocle","Barnard"))

安装完以后重新运行有21份结果。

最终代码

此外,我发现这个代码有部分是冗余的,同时也不能展示出现问题的究竟是哪一个脚本,因此重新修改为

fs=list.files('./',pattern = '*.R$');fs
for (i in fs){tryCatch(
  {source(i)},
  warning = function(a){message("warning @ ", i," @ ", a)},
  error = function(b){message("error @ ",i," @ ", b)}
)}

解释

这个代码也很好理解,首先用list.files() 列出工作目录的所有脚本,再用for in循环依次执行tryCatch,依次运行每一个脚本,如果运行过程中有warning,就会提示「warning @ 脚本名 @ warning的具体内容」,如果运行中有error,就会提示「error @ 脚本名 @ error的具体内容」

因为有个R包始终装不上,查看一下已经被移除了CRAN,就不继续折腾了,以提供思路为主。

参考资料

[1]

测试脚本下载地址: https://github.com/sangho1130/KOR_HCC

[2]

R语言tryCatch使用方法:判断Warning和Error: https://blog.sciencenet.cn/blog-2577109-1251678.html

[3]

中断运行 r 忽略报错 继续运行: https://blog.csdn.net/qq_52813185/article/details/123338171