2016-02-18 58 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