R脚本封装必备模板——argparse版

将R脚本封装后在linux下运行必备。脚本分区较多,根据自己需求可以删减一部分内容。这也是我在使用的最新版本的R脚本模板了。
使用R版本
argparse
包写脚本模板,仍然依赖于Python版本的模块。调用了R包
cli
和prettyunits
,一般提到的推文很少,多用于开发。cli
包使用可以见我之间推文多以
包::函数
的方式调用函数。使用
{ }
将较大分区分开,便于代码梳理。
脚本分区
基础设置:Rscript调用,语言设置和管道符启用设置。
以library()方式展示使用了哪些包。全部注释掉,仅作提示用。
写出conda环境下使用该脚本所需环境的配置命令
设置脚本选项参数,并作解析和检查
起始时间记录:记录脚本运行起始时间。建议在脚本选项参数解析之后记录脚本运行起始时间。
将选项转换为常规变量
调试用参数:封脚本时需要改为F。仅为调试脚本命令。
输入文件的检查
定义函数:将常用函数放到这里。本模板把
WGCNA::collectGarbage
代码放在这里,定义为wgcna_collectGarbage
函数,用于最后内存释放。脚本代码⭐⭐⭐。是该脚本所需功能实现的主体部分。
回收内存:根据需要运行
wgcna_collectGarbage
。完成时间记录:记录脚本运行完成时间,并计算脚本运行用时。
脚本模板
#!/usr/bin/env Rscript
Sys.setenv(LANGUAGE = "en") # 设置提示信息为英文
suppressPackageStartupMessages(library(magrittr, quietly = T))
# # 所需安装包,仅作展示查看,不做运行。
# {
# library(argparse) # 该模块依赖于Python的同名模块。
# library(prettyunits)
# library(lubridate)
# library(stringr)
# library(vroom)
# library(dplyr)
# }
# conda安装所需模块
##mamba install -c conda-forge r-argparse r-prettyunits r-lubridate # r-stringr r-vroom r-dplyr
# 设置脚本选项参数
{
parser <- argparse::ArgumentParser(description = "Get bed file of ssr sequence!")
# 添加选项
parser$add_argument("-i","--input",action = "store",type = "character",
help = "The input.")
parser$add_argument("-t","--thread",action = "store",type = "integer", default = 10,
help = "Threads. [default: 10]")
# type: 'logical', 'integer', 'double' or 'character'
# 解析参数为一个list
args <- parser$parse_args()
# args #打印查看参数内容
parser$print_help() #打印帮助文档,用于调试 # 测试完毕需要注释掉这一行。
}
# 时间设置:起始时间记录。
{
start_time <- lubridate::now(tzone = 'Asia/Shanghai') #记录开始时间
cli::cat_line("Start time: ",cli::col_red(start_time),"!")
}
# 将选项转换为常规变量
{
input <- args$input #输入文件
}
# 调试用参数:封脚本时需要改为F。
if(F){
input <- "./Trinity.fa.misa"
}
# 检查文件
{
# 输入文件:两个,其中misa文件为显,fasta文件也必须包含。
## 直接检查misa文件
if(file.exists(misa)){
cli::cli_inform(message = paste0("OK: ",cli::col_red(input)))
}else{
cli::cli_abort(message = c("{cli::col_red(input)} does not exist!",
"x"="You've supplied {cli::col_red(input)} in current directory!"))
}
## 检查fasta文件
fasta_file <- stringr::str_remove(input,pattern = "\\.misa")
}
# 定义函数
{
# WGCNA::collectGarbage # 不讲武德地直接复制过来代码了,因为WGCNA安装常常不是很顺。
wgcna_collectGarbage <- function(){
while (gc()[2, 4] != gc()[2, 4] | gc()[1, 4] != gc()[1, 4]) {
}
}
# 读入fasta为df
read_bio_fasta <- function(fasta){
fa <- vroom::vroom_lines(file = fasta, skip_empty_rows = TRUE)
# a vector of fasta id
id <- fa[stringr::str_detect(fa, "^>")] %>% stringr::str_remove(pattern = "^>")
# a vector of fasta sequence
seq <- stringr::str_replace_all(fa,pattern = "^>.*",replacement = ">") %>% paste0(collapse = "") %>% stringr::str_split(pattern = ">")
seq <- seq[[1]][-1]
return(data.frame(id = id, sequence = seq))
}
}
# 脚本代码⭐⭐⭐
{
# 写入你的内容
}
# 回收内存:根据需要使用
{
# 可以使用简单的invisible(gc())
# invisible(gc())
# 如果安装了R包WGCNA,还可以调用WGCNA::collectGarbage
wgcna_collectGarbage()
}
# 计算运行用时
{
# 时间设置:运行时间记录
end_time <- lubridate::now(tzone = 'Asia/Shanghai') #记录结束时间
cli::cat_line("End time: ",cli::col_red(end_time),"!") # 打印结束时间
# 计算时间差
runtime <- lubridate::interval(start = start_time, end = end_time) %>%
lubridate::time_length(unit = "second")
cli::cat_line("Time consuming: ", cli::col_red(prettyunits::pretty_sec(runtime)), "!")# 使用prettyunits美化时间差。
}
收费业务
『收费服务』 SSR分析收费版:MISA+Primer3流程
『收费服务』Uniprot数据库拆分fasta文件获取
