为什么我的bash不能执行R脚本?

问题描述:

我的脚本使用对mysql的访问来获取命令参数来启动Rscript。其使用如下:Rscript $ RFILE $ ARGUMENTS(RFILE对应于Rscript的路径,以及ARGUMENTS对应于所使用的路径文件和agr)。为什么我的bash不能执行R脚本?

我尝试不同的方式,但我仍然有错误,在这里我的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 

我验证了我的命令行(通过回声),如果我做了一个复制粘贴到我的shell可以运行我的R脚本。但从我的bash中,我无法执行我的脚本(但命令行很好)。

使用:RSCRIPT $的RFile $参数,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 

如果我尝试这在我的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" 

有人有想法?

感谢

我放了一个脚本修复的副本,但我仍然有一些问题:

#!/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参数或$运行。

该脚本的目的是通过恢复数据库中的所有参数来运行任何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 

有没有更好的方式来进行呢?
例如,为文件路径定义一个新列(例如:script_Files)?
用逗号分隔参数(例如:l = 0,w = 3,r = 6等),并将字符串拆分成数组(例子可以帮助我)?

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

在从RSCRIPT输出采样你报:

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

我注意到,有很奇怪的报价对那里发生的:在启动两种"秒,=后一个',最后只有一个"

至少,我期望在路径的末尾匹配',并可能是一些以平衡那些" S以及

我猜它是与此相关的线路:

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

我猜你正在删除其中一个'

更新:如其他人指出的,您的文件名包含空格。 总是"放在变量名称的周围,当它包含文件名时,特别是当你知道这些文件名包含空格时。请尝试:

Rscript "$RFILE" $ARGUMENTS 
+0

我尝试修复,但现在,我有:错误粘贴(path_in,sep =“”):对象'path_in'未找到 – 2010-01-11 23:49:44

+0

尝试在你的其他变量周围添加引号:“$ ARGUMENTS”来保存它也是空间。 – Benson 2010-01-12 00:51:40

+0

根据最后一个代码示例,它看起来像$ ARGUMENT包含多个由空格分隔的值('l = 32 w = 33')。使用'“$ ARGUMENT”'会将整个字符串作为单个标记传递给Rscript; Rscript可能不理解(Rscript可能认为你试图说'l'等于'32 w = 33')。把''''离开''可以让bash把'l = 32'和'w = 33'分离成单独的标记,这就使得Rscript更有可能将它们解释为不同的参数。我想你可能不想引用'$ 。ARGUMENTS' – 2010-01-12 01:12:37

看来您正在失去某处空间的某些引用。你有这样的错误消息:

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

我尝试修复与文件名“Gene.csv”,但现在,我有:在粘贴错误(path_in 09月=“”):对象path_in'未找到 – 2010-01-11 23:55:11

+1

当然 - 这也正是' “'应该是在该行的末尾失踪 - 一切的空间后失踪 – 2010-01-12 00:23:44

+1

我尝试回声,我有很好的文件路径:” path_in 2010-01-12 00:28:50

为什么这是一个bash脚本当你有Rscript?那么,为什么你不重写这个由Rscript.exe执行的R脚本允许你测试组件

  • intialization
  • 数据库连接
  • 核心工作
  • ...

独立?

编辑(回复您的评论): R可以打电话给R,或者通过library()打包,或者直接通过source()打包。你有一个调试问题是comples,你应该尝试删除一些complextity。而且,R脚本可以使用getopt或optparse包来处理命令行参数。

编辑2:您是否知道R有一个RMySQL软件包,可让您从R调用db?

+0

我的bash脚本是作为接口来调用不同的R脚本通过使用bash脚本和MySQL数据库,我可以调用不同的R脚本。 (理论上) – 2010-01-12 00:07:36

+0

我将测试这种方法并获得一些教程...谢谢 – 2010-01-12 17:04:22

+0

这是更好的方法。挂在那里,你会喜欢它。 – 2010-01-12 17:34:07

首先,你可能想尝试加入-S(更新-e以-se)你的MySQL行:

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

您应该能够删除您SUBSTRING更换。 同样适用于您的变量自变量。用你的mysql行中的-se替换-se,并删除SUBSTRING替换。

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

+0

谢谢,通过使用-se,我可以启动我的R脚本;我需要使用eval“$ RUN”。这是SUBSTRING更换的问题。 – 2010-01-12 16:53:13

好吧,我想你可能需要改变你在数据库中存储的内容。

您script_args场大概应该是这样在你的数据库:

path_in = \ “/用户/ GR/web应用/ Rproject /输入/ RSCRIPT/Gene.csv \” path_in2 = \“/用户/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 

而且你可能并不需要在此CA的eval SE,你可以运行$本身运行不带EVAL甚至只是把

Rscript $RFILE $ARGUMENTS

一行全部由自己。