1

我的脚本使用对 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),如果我复制粘贴到我的 shell,我可以运行我的 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

如果我在我的 shell 脚本中尝试这个,一切正常:

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 脚本

  • 初始化
  • 数据库连接
  • 核心工作
  • ...

单独?

编辑(回应您的评论): R 可以调用 R,通过library()或直接通过source(). 您有一个复杂的调试问题,您应该尝试消除一些复杂性。此外,R 脚本可以使用 getopt 或 optparse 包来处理命令行参数。

编辑 2:您是否知道 R 有一个RMySQL包可以让您从 R 调用数据库?

于 2010-01-11T23:50:12.020 回答
1

在您引用的 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'之后有一个,最后=只有一个"

至少我希望'在路径的尽头有一个匹配,并且可能"还有一些东西来平衡那些 s

我猜它与这条线有关:

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

我猜你正在删除'那个替换中的一个 s 。

更新:正如其他人指出的那样,您的文件名包含空格。当变量名包含文件名时,总是在变量名周围加上s,尤其是当您知道这些文件名包含空格时。"尝试:

Rscript "$RFILE" $ARGUMENTS
于 2010-01-11T23:44:07.697 回答
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

首先,您可能想尝试将 -s(将 -e 更新为 -se)添加到您的 mysql 行:

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

您应该能够删除您的 SUBSTRING 替换。您的变量 ARGUMENTS 也是如此。在您的 mysql 行中将 -e 替换为 -se 并删除 SUBSTRING 替换。

这可能无法解决您的问题,但它会消除有关您的扩展更换的任何问题。虽然如果由于某种原因在第一行的末尾有一个 \n 或其他内容,您可以在其中替换 $RFILE 和 $ARGUMENTS 中的 SUBSTRING ...

于 2010-01-12T03:15:47.023 回答
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 脚本。这是我的数据库中的数据副本:

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

有更好的方法吗?
例如,为文件路径定义一个新列 (ex:script_Files) ?
用逗号分隔参数(例如:l=0、w=3、r=6 等),并将字符串拆分为数组(一个示例可以帮助我)?

谢谢
ps:一个好办法,大概是直接用Rscript。

于 2010-01-12T17:35:46.190 回答
0

好的,我认为您可能需要更改存储在数据库中的内容。

您的 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 并且您可以在没有 eval 的情况下自行运行 $RUN ,甚至只是 put

Rscript $RFILE $ARGUMENTS

独自在一条线上。

于 2010-01-13T02:31:06.143 回答