1

私のスクリプトは、mysql へのアクセスを使用してコマンド引数を取得し、Rscript を起動します。その使用法は次のとおりです: Rscript $RFILE $ARGUMENTS (Rscript へのパスに対応する RFILE、および使用されるパス ファイルと agr に対応する ARGUMENTS)。

別の方法で試してみましたが、まだエラーがあります。ここに私のbashスクリプトのコピーがあります:

#!/usr/bin/env bash
# Execute R process
# -----------------
### Mysql Setup ###
USER=...
PASS=...
HOST=...
DB=...

# Get Job ID process
# Use to retrieve args in my DB
ID=$1

# Get script name
RFILE=$(mysql -u$USER -p$PASS -e "SELECT script_name FROM JobProcess WHERE script_run_id=$ID;" $DB)
SUBSTRING="script_name"
RFILE="${RFILE//$SUBSTRING}"

# Get script_args
ARGUMENTS=$(mysql -u$USER -p$PASS -e "SELECT script_args FROM JobProcess WHERE script_run_id=$ID;" $DB)
SUBSTRING2="script_args"
ARGUMENTS="${ARGUMENTS//$SUBSTRING2}"

RUN="Rscript $RFILE $ARGUMENTS"

# Try Different execute process
Rscript $RFILE $ARGUMENTS
#eval "$RUN"
#`Rscript $RFILE $ARGUMENTS`
#$RUN

コマンド ラインを (echo 経由で) 確認し、シェルにコピー アンド ペーストした場合は、R スクリプトを実行できます。しかし、私の bash からは、スクリプトを実行できません (ただし、コマンド ラインは適切です)。

Rscript $RFILE $ARGUMENTSRscript $RFILE $ARGUMENTSと $RUN を使用すると、次のエラーが発生します。

Error in parse(text = args[[i]]) : 
  unexpected end of input in ""path_in='/Users/GR/web-app/Rproject/Inputs/Rscript/Gene-level"
Calls: eval -> parse
Execution halted

: eval "$RUN" を使用すると、次のエラーが発生します。

/Users/GR/web-app/Rproject/Scripts/Rscript.sh: line 38: /Users/GR/web-app/Rproject/Scripts/arg_file_test.R: Permission denied
/Users/GR/web-app/Rproject/Scripts/Rscript.sh: line 44: path_in<-"/Users/GR/web-app/Rproject/Inputs/Rscript/Gene-level Description for Modules.csv": No such file or directory

シェルスクリプトでこれを試すと、すべて正常に動作します:

SCRIPT="/Users/GR/web-app/Rproject/Scripts/arg_file_test.R"
FILE1="path_in='/Users/GR/web-app/Rproject/Inputs/Rscript/Gene-level Description for Modules.csv'"
FILE2="path_in2='/Users/GR/web-app/Rproject/Inputs/Rscript/Template_Auto.csv'"
FILES="\"$FILE1\" \"$FILE2\""
ARG="l=32 w=33"
RUN="Rscript $SCRIPT $FILES $ARG"

誰かがアイデアを持っていますか?

ありがとう

4

6 に答える 6

2

あなたが持っているのになぜこれがbashスクリプトなのRscriptですか?Rscript.exeでは、コンポーネントをテストできるようにして実行されるRスクリプトとしてこれを書き直してみませんか。

  • 初期化
  • データベース接続
  • コアワーク
  • ..。

個別に?

編集(コメントに応じて):library() Rは、を介して、またはを介して直接 、Rを呼び出すことができますsource()。完全なデバッグの問題があり、複雑さを取り除くようにしてください。さらに、Rスクリプトはgetoptまたはoptparseパッケージを使用して、コマンドライン引数を処理できます。

編集2: RにRMySQLパッケージがあり、Rからdbを呼び出すことができることをご存知ですか?

于 2010-01-11T23:50:12.020 に答える
1

どこかでスペースの引用符の一部を失っているようです。次のエラーメッセージが表示されます。

Error in parse(text = args[[i]]) : 
  unexpected end of input in ""path_in='/Users/GR/web-app/Rproject/Inputs/Rscript/Gene-level"

しかし、他のテキストから、ファイル名は明らかに

/Users/GR/web-app/Rproject/Inputs/Rscript/Gene-level Description for Modules.csv

これは、問題の説明としても意味があります。これは、実行している変数の置換によって、スペースを含む引数が保護引用符を失う可能性があるためです。たとえば、スペースをアンダースコアに置き換えて再試行することにより、そのファイル(および他の同様のファイル)の名前をスペースを含まない名前に変更することは可能でしょうか?

于 2010-01-11T23:48:57.823 に答える
0

スクリプト修正のコピーを入れましたが、まだいくつか質問があります。

#!/usr/bin/env bash
# Execute R process
# -----------------
### Mysql Setup ###
USER=...
PASS=...
HOST=...
DB=...

# Get Job ID process
# Use to retrieve args in my DB
ID=$1

# Get script name
RFILE=$(mysql -u$USER -p$PASS -se "SELECT script_name FROM JobProcess WHERE script_run_id=$ID;" $DB)

# Get script_args
ARGUMENTS=$(mysql -u$USER -p$PASS -se "SELECT script_args FROM JobProcess WHERE script_run_id=$ID;" $DB)

RUN="Rscript $RFILE $ARGUMENTS"
eval "$RUN"

実際、私は使用できません (おそらく分離されたトークンが悪いため): Rscript $RFILE $ARGUMENTS または $RUN.

このスクリプトの目的は、データベース内のすべてのパラメーターを回復することにより、任意の R スクリプトを実行することです。ここに私のDBのデータのコピーがあります:

script_run_id : 161
script_name : /Users/GR/web-app/Rproject/Scripts/arg_file_test.R
script_args : 'path_in<-"/Users/GR/web-app/Rproject/Inputs/Rscript/Gene.csv"' 'path_in2<-"/Users/GR/web-app/Rproject/Inputs/Rscript/Template_Auto.csv"' l=0 w=0 

部分 script_name は呼び出す R スクリプトを定義し、scripts_args はこの R スクリプトで使用される引数を定義します。この例では、私のスクリプトは次のコマンド ラインを生成します。

Rscript /Users/GR/web-app/Rproject/Scripts/arg_file_test.R 'path_in<-"/Users/GR/web-app/Rproject/Inputs/Rscript/Gene.csv"' 'path_in2<-"/Users/GR/web-app/Rproject/Inputs/Rscript/Template_Auto.csv"' l=0 w=0

続行するためのより良い方法はありますか?
たとえば、ファイル パス (例:script_Files) の新しい列を定義しますか?
引数をコンマで区切り (例:l=0、w=3、r=6 など)、文字列を配列に分割します (例が役立ちます) ?

ありがとう
ps : 良い方法は、おそらく Rscript を直接使用することです。

于 2010-01-12T17:35:46.190 に答える
0

まず、mysql 行に -s (-e を -se に更新) を追加してみてください。

RFILE=$(mysql -u$USER -p$PASS -se "SELECT script_name FROM JobProcess WHERE script_run_id=$ID;" $DB)

SUBSTRING 置換を削除できるはずです。変数 ARGUMENTS についても同様です。mysql 行で -e を -se に置き換え、SUBSTRING 置換を削除します。

これでおそらく問題は解決しませんが、拡張の交換に関する疑問は解消されます。$RFILE と $ARGUMENTS の SUBSTRING を置き換える最初の行の末尾に何らかの理由で \n などがある場合は...

于 2010-01-12T03:15:47.023 に答える