簡體   English   中英

為什么我的bash無法執行R腳本?

[英]Why my bash can't execute R script?

我的腳本使用對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 $ 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

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

有人有想法嗎?

謝謝

當你有Rscript時,為什么這是一個bash腳本? 那你為什么不把它重寫為Rscript.exe執行的R腳本,允許你測試組件

  • intialization
  • 數據庫連接
  • 核心工作
  • ...

獨立?

編輯(響應你的評論): R可以通過library()或直接通過source()調用R,包。 你有一個comples的調試問題,你應該嘗試刪除一些完整性。 此外,R腳本可以使用getopt或optparse包來處理命令行參數。

編輯2:你知道R有一個RMySQL包允許你從R調用db嗎?

在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

看來你在某處丟失了一些空格。 您有此錯誤消息:

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

這也可以作為您問題的解釋,因為您正在進行的變量替換很可能導致包含空格的參數失去其保護性引用。 您是否可以將該文件(以及任何其他類似的文件)重命名為不包含空格的名稱,例如,通過用下划線替換空格,然后再試一次?

首先,您可能想嘗試將-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行中用-se替換-e並刪除SUBSTRING替換。

這可能無法解決您的問題,但它會刪除有關您的擴展替換的任何問題。 雖然如果由於某種原因在第一行的末尾有一個\\ n或者什么東西,你在$ RFILE和$ ARGUMENTS中替換SUBSTRING ......

我把一個腳本修復副本,但我仍然有一些問題:

#!/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。

好吧,我想你可能需要改變你在數據庫中存儲的內容。

你的script_args字段應該在你的db中看起來像這樣:

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甚至只是put

Rscript $RFILE $ARGUMENTS

在一條線上本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM