2016-06-13 11 views
3

与えられたディレクトリ内のすべてのファイルに対して、R(strandcode.txt)で書いた関数を反復しようとしています。Bashコマンドラインのファイルに対してR関数を実行する

strandcode.txtを以下に示します。これは、Chi Squaredテストを計算する簡単な関数です。

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} 

私はRscriptを使用して、以下のコマンドでディレクトリ内のすべてのファイルを反復処理しています私のLinuxサーバ上でこれを実行しています。

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 

両方ともエラーなしで出力され、出力ファイルには何も出力されません。

ご意見をいただければ幸いです。ありがとう!

+2

'strand {$ i}'は適切なRコードではありません。あなたの '$ i'はスクリプトの中では見えませんので、あなたのスクリプトが知っているものに' $ i'としてbashが何を持っているのかを知る必要があります。これはhttp://stackoverflow.com/questions/2151212/how-can-i-read-command-line-parameters-from-an-r-scriptとリンクされたページhttp://stackoverflow.comの複製である可能性があります/ questions/2151212/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

関連する問題