2013-07-06 150 views
3

我必須從shell腳本運行knitr。但是我搞砸了。如何從shell腳本運行knitr

我的shell腳本test.sh是:

#!/bin/bash 

input=$1 
echo Input $input 

# I want to start the following when input is test.Rnw 
# /usr/bin/Rscript -e 'library(knitr); knit("test.Rnw")' 

cmd_start="'library(knitr);knit(\"" 
cmd_end="\")'" 

echo /usr/bin/Rscript -e $cmd_start$input$cmd_end 
/usr/bin/Rscript -e $cmd_start$input$cmd_end 

在運行時

./test.sh test.Rnw

輸出

Input test.Rnw 
/usr/bin/Rscript -e 'library(knitr);knit("test.Rnw")' 
[1] "library(knitr);knit(\"test.Rnw\")" 

所以命令似乎沒問題。但R沒有運行knitr。相反,它將輸入作爲變量處理。

運行

/usr/bin/Rscript -e 'library(knitr);knit("test.Rnw")' 

不正確的。

我錯過了什麼?

+0

由於周圍我寫的代碼庫(knitr)的作品;在一個臨時文件,運行鍼織( 「test.Rnw」)這通過Rscript tmpfile。但我認爲這有點笨拙。 – JerryWho

+0

出於好奇,爲什麼直接使用'#!/ bin/bash'而不是'#!/ usr/bin/Rscript'?然後,您可以在腳本中使用'commandArgs()'和R語法。 – baptiste

+0

@baptiste:我的例子是一個更大的shell腳本的一部分。所以我不能只使用Rscript。 – JerryWho

回答

5

您的問題是雙引號:$cmd_start$input$cmd_end變成'library(knitr);knit(\"test.Rnw\")',但不是'library(knitr);knit("test.Rnw")'

嘗試以下操作:

cmd_start='library(knitr);knit("' 
cmd_end='")' 

/usr/bin/Rscript -e $cmd_start$input$cmd_end 

或者:

/usr/bin/Rscript -e "library(knitr); knit(\"${input}\")" 
+0

謝謝,最後一行完美無缺! – JerryWho