R腳本的傳參
爾云間 ?一個(gè)專門做科研的團(tuán)隊(duì)
? ?

今天小果為大家?guī)淼氖荝腳本的傳參。一個(gè)R腳本要在linux上運(yùn)行時(shí)不可避免的要使用到參數(shù)傳遞這一功能。坦率得講,R語言自帶的commandArgs()函數(shù)完全可以勝任大多數(shù)的參數(shù)傳遞任務(wù),但是為了更方便觀察更推薦使用getopt包。
函數(shù)commandArgs()的使用:
例如,腳本文件名為foot.R, 可以這樣寫:
arg=commandArgs(T)
input1<-arg[1]
Input2<-arg[2]
...
函數(shù)中有一個(gè)布爾型參數(shù)TRUE,這個(gè)意思是讓函數(shù)可以將接收到的所有輸入依次存儲(chǔ)進(jìn)arg列表中。那么參數(shù)是如何傳入腳本的呢?
在使用commandArgs()函數(shù)時(shí),參數(shù)是沒有名字的,只需:
Rscript ?foot.R ?1 ?2
即可將1與2傳入腳本,按照順序1將被存入arg[1],2將被存入arg[2]那么如果檢驗(yàn)輸入?yún)?shù)的數(shù)目呢?可以這樣寫:
If(length(arg)!=2){
cat(“you shoudl in put 1. input2 2.input2”)
break
}
但是,這種寫法有兩個(gè)弊端:
一是如果你需要的是一個(gè)字符串1,那么很幸運(yùn)直接用就可以。但如果你需要的是一個(gè)數(shù)值型的1,那你是無法直接傳入的,需要在腳本中轉(zhuǎn)化才行,很不方便。
二是如果我輸入了,但是輸錯(cuò)了,你需要的是數(shù)字,但我輸入的是一個(gè)蘋果和一個(gè)栗子,函數(shù)會(huì)照單全收全部吃進(jìn)arg列表中,這也會(huì)帶來麻煩。所以,我們有一個(gè)單獨(dú)用來傳參的getopt包可以使用,更方便。
library(getopt)
首先創(chuàng)建一個(gè)列數(shù)為5的矩陣。第一列參數(shù)名;第二列參數(shù)名簡(jiǎn)寫;第三列0,1或2依次表示不接收變量,可以接收變量與必須接受變量;第四列為變量的類型又logical、integer、double、complex、character、numeric可供選擇;第5列為變量的說明。而矩陣的每一行就是一個(gè)參數(shù)。
spec <- matrix(
c("expr",? "e", 1, "character", "This is path of gene expr!",
"help",?? "h", 0, "logical",? "This is Help!"),
byrow=TRUE, ncol=5)
opt <- getopt(spec=spec)
這里的opt存儲(chǔ)了輸入的全部的參數(shù),若要調(diào)用只需opt$參數(shù)名即可
if( !is.null(opt$help) || is.null(opt$expr) ){
cat(paste(getopt(spec=spec, usage = T), "\n"))
quit()
}
這一個(gè)檢驗(yàn)參數(shù)的步驟,如果想偷懶的話,藍(lán)字不用變,只要根據(jù)自己的參數(shù)數(shù)量對(duì)is.null部分進(jìn)行增改就可以。

使用時(shí)只需這樣寫命令:Rscript foot.R --expr 文件的路徑 或Rscript foot.R ?-e 文件的路徑。
今天的分享就到這里,小果祝大家生活愉快。
推薦閱讀
關(guān)注小果,小果將會(huì)持續(xù)為你帶來更多生信干貨哦。

“生信果”,生信入門、R語言、生信圖解讀與繪制、軟件操作、代碼復(fù)現(xiàn)、生信硬核知識(shí)技能、服務(wù)器、生物信息學(xué)的教程,以及基于R的分析和可視化等原創(chuàng)內(nèi)容,一起見證小白和大佬的成長(zhǎng)。