曾老师曾经有一篇推文《批量运行多个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」来解决这个问题。
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