2016-06-13 87 views
3

我正在尝试将R(strandcode.txt)中写入的函数遍历给定目录中的所有文件。在Bash命令行中的文件上运行R函数

strandcode.txt如下所示,它是计算卡方检验的简单函数。

strand <- function(file){ 
data <- as.data.frame(read.table(file)) 
colnames(data) <- c('chr', 'pos', 'fwd', 'bkwd') 
data$chi <- ((.5 - (data$fwd/(data$fwd + data$bkwd)))^2)/.5 
keep <- data[data$chi < .823, ] 
return(keep) 
} 

strand{$i} 

当我在我的Linux服务器上运行这个时,我使用Rscript并使用下面的命令遍历目录中的所有文件。

for i in $(ls); do Rscript strandcode.txt >> strandout.txt; done 

然而,这是给我的错误 错误:意外“{”在“链{” 执行暂停

我也曾尝试下面的命令行(以最终线路输出strandcode的。 txt)

for i in $(ls); do Rscript strandcode.txt; Rscript strand{$i} >>  strandout.txt; done 
for i in $(ls); do Rscript strandcode.txt strand{$i} >> strandout.txt; done 

两者都运行没有错误,并没有输出任何东西到我outfile。

任何建议将不胜感激。谢谢!

+2

'strand {$ i}'不是正确的R代码。你的'$ i'在脚本中是不可见的,所以你需要知道bash所知道的'$ i'到你的脚本知道的东西。这可能是http://stackoverflow.com/questions/2151212/how-can-i-read-command-line-parameters-from-an-r-script和链接页面的副本http://stackoverflow.com/questions/2151212/how-can-i-read-command-line-parameters-from-an-r-script/2151627#2151627,其中Dirk修改他的建议。 – r2evans

回答

3

您必须使用仅与数据文件相匹配的模式,而不是$(ls),它扩展到目录中的每个文件,包括strandcode.txt。假设你已经感动了所有的数据文件到一个名为data/子目录,可以去除strandcode.txt最后一行,如评论说这是不正确之后做

for i in data/*; do Rscript -e "source('strandcode.txt'); print(strand('$i'))" >> strandout.txt; done 

。只要文件名不包含单引号或其他有问题的字符,这应该工作。

+0

此外,这是[无用的'ls'](http://www.iki.fi/era/unix/award.html#ls)。 – tripleee