Почему мой bash не может выполнить скрипт R? - PullRequest
1 голос
/ 12 января 2010

Мой скрипт использует доступ к mysql для получения аргументов команды для запуска Rscript. Он используется следующим образом: Rscript $ RFILE $ ARGUMENTS (RFILE, соответствующий пути к Rscript, и ARGUMENTS, соответствующий используемому файлу пути и agr).

Я пытаюсь по-другому, но у меня все еще есть ошибки, вот копия моего 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 $ ARGUMENTS, Rscript $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"

У кого-то есть идея?

Спасибо

Ответы [ 6 ]

2 голосов
/ 12 января 2010

Почему это bash скрипт, если у вас Rscript? Так почему бы вам не переписать это как скрипт R, выполняемый Rscript.exe, позволяющий вам тестировать компоненты

  • intialization
  • подключение к базе данных
  • основная работа
  • ...

индивидуально?

Редактировать (в ответ на ваш комментарий): R может вызывать R, либо пакеты через library(), либо напрямую через source(). У вас есть проблема отладки, которая является полной, и вы должны попытаться удалить некоторую завершенность. Кроме того, сценарии R могут использовать пакеты getopt или optparse для обработки аргументов командной строки.

Редактировать 2: Знаете ли вы, что R имеет пакет RMySQL , который позволит вам вызывать БД из R?

1 голос
/ 12 января 2010

Похоже, что вы теряете часть цитирования пробелов где-то. У вас есть это сообщение об ошибке:

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

Это также имело бы смысл в качестве объяснения вашей проблемы, поскольку подстановка переменной, которую вы делаете, может привести к тому, что аргумент, содержащий пробел, потеряет свою защитную кавычку. Можно ли переименовать этот файл (и любые другие подобные) в имя, не содержащее пробелов, скажем, заменив пробелы подчеркиванием и повторив попытку?

1 голос
/ 12 января 2010

В примере вывода из Rscript, который вы цитировали:

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

Я заметил, что там происходит очень странное цитирование: два " s в начале, один ' после = и просто один " в конце.

По крайней мере, я бы ожидал совпадение ' в конце пути и, вероятно, что-то, чтобы сбалансировать и эти " s

Полагаю, это связано с этой строкой:

RFILE="${RFILE//$SUBSTRING}"

Я предполагаю, что вы удаляете один из ' в этой замене.

Обновлено: как уже отмечали другие, ваши имена файлов содержат пробелы. всегда ставьте " s вокруг имени переменной, если она содержит имена файлов, особенно если вы знаете, что эти имена содержат пробелы. Попробуйте:

Rscript "$RFILE" $ARGUMENTS
0 голосов
/ 13 января 2010

хорошо, я думаю, вам может понадобиться изменить то, что вы храните в своей базе данных.

Ваше поле 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

без каких-либо других знаков препинания или экранирования ... Когда вы заполняете свою переменную и затем расширяете ее во время вашего eval или другого метода, это будет выглядеть после расширения:


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

Также в этом случае вам, вероятно, не нужен eval, и вы можете запустить $ RUN без eval или даже просто поставить

Rscript $RFILE $ARGUMENTS

на одной строке.

0 голосов
/ 12 января 2010

Я поставил копию исправления скрипта, но у меня остались некоторые вопросы:

#!/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, восстановив все параметры в базе данных. Вот копия данных в моей БД:

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 

Part 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.

0 голосов
/ 12 января 2010

Сначала вы можете попробовать добавить -s (обновив -e в -se) к вашей строке mysql:

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

Вы сможете удалить замену SUBSTRING. То же самое касается ваших переменных. АРГУМЕНТЫ. Замените -e на -se в строке mysql и удалите замену SUBSTRING.

Это, вероятно, не решит вашу проблему, но удалит все вопросы о замене вашего расширения. Хотя, если по какой-то причине в конце первой строки был \ n или что-то еще, вы заменяете SUBSTRING на $ RFILE и $ ARGUMENTS ...

...