2016-02-18 78 views
1

假設我有一個數據幀,看起來像這樣:的R - 參數在命令行錯誤

SNP Frequency 
A  20 
B  50 
C  7 

(真正的數據幀當然有更多的行。)

我想怎麼辦將一些參數傳遞給命令行,這將允許我在命令行中設置輸入數據幀和頻率。這是我曾嘗試:

args = commandArgs() 
df <-args[1] 
freqsub <- subset(df, args[2],header=TRUE) 

args[2]部分我通常具有的Frequency > somenumber

我知道如何去解決它,當我有df <- args[1],但args[2]沒有。

$ Rscript sumtest.R test.txt Frequency>20 

"Error in subset.default(df, args[2], header = TRUE) : 
    argument "subset" is missing, with no default 
Calls: subset -> subset.default 
Execution halted" 

任何想法?如果需要更多信息,很高興編輯(我無法確定是否是這種情況,對不起)。

回答

0

我認爲你必須使用選項trailingOnly = TRUE

args = commandArgs (trailingOnly = TRUE) 

否則ARGS [1] ARGS [2]不是你期待什麼?

隨着trailingOnly = FALSE你在得到args的第一個職位是關於R進程如何運行的信息。

你可以這樣做:

print (args) 

在你的shell,看看有什麼是你真正在args矢量擁有。

除此之外「頻率> 20」將在args [2]作爲一個字符...所以你必須處理它,如果你想有作爲subset函數的參數。

在這種情況下,我只會將數字作爲參數讀入args [2]。然後,你可以這樣做:

subset(df, Frequency > as.numeric (args[2]), header=TRUE) 

所以按照你的意見我會做2個R腳本:

第一個只是爲了確保您閱讀的正確的參數爲:

args = commandArgs (trailingOnly = TRUE) 
myfile = args[1] 
myfreq = as.numeric (args[2]) 
print (myfile) 
print (myfreq)  

這你必須在你的shell中運行它:

Rscript script1.R file.txt 5 

,你應該得到這樣的輸出:

file.txt 
5 

在你的第二個腳本做:

myfile = "file.txt" 
myfreq = 5 

## and all computations you need 
df = read.table (myfile, ... 
subset(df, myfreq, ...) 

調試第二個文件(交互),直到它的工作原理,然後更改前兩行:由(3)第一個文件中的commandArgs行。

+0

感謝您的建議。我試了一下你的建議,並得到了這個問題: 有50個或更多的警告(使用警告()看到的第一個50) 警告消息: 在EVAL(表達式,ENVIR,enclos):來港受到脅迫 同時推出,我可以問你在哪裏打印(參數)檢查?當你說shell時,我認爲它是這一行: '$ Rscript sumtest.R test.txt 20' – Gotmadstacks

+0

我認爲你應該首先嚐試在R交互式會話中調試代碼中的分析部分,然後將腳本轉換爲使用commandArgs可執行文件。這個問題似乎與你正在處理的數據或你如何做的更相關。 – dmontaner

+0

'print(args)'你可以把它放在適合你的任何地方,或者更方便你使用。這只是爲了確保你正在閱讀... – dmontaner