我有一个R脚本接受命令行参数,我希望将其转换为Rtex或Rnw文件,并使用如下命令编写:
knit('myScript.Rtex "-args arg1=a arg2=b"')
但我无法弄清楚如何将我的命令行参数放入myScript.Rtex [由args <- commandArgs()
进行评估]。我试图避免编写可能包含相同信息的临时文件,并由myScript.Rtex读取,因为这似乎不必要的不整洁。请有人提供建议/解决方案吗?
所以,长话短说,如何最好地将信息放入.Rnw文件中与.R文件中处理命令行参数等效(或至少类似)的块中?
我想在计算中使用它们。例如,我有一个像
一样运行的R脚本R CMD BATCH --slave --no-save --no-restore "--args input=blah" myScript.R
现在我想将相同的参数传递给myScript.Rnw
,这是myScript.R
的一个版本,但是散布了LaTeX和R代码块。因此,更广泛的问题只是针对编织器报告处理对我有用,我需要一种方法来更改运行报告的数据。我有一个解决方法 - 但我肯定想知道我是否可以将命令行参数传递给我的.Rnw文件中的一个块。现在我做不到。
这是我的解决方法:
#!/bin/bash
if [ $# -ne 2 ];
then ` echo "Usage: $0 refdir cmpdir" exit 1`
fi
export CSPP_VIIRS_EDR_REFERENCE_DIR=$1
export CSPP_VIIRS_EDR_COMPARISON_DIR=$2
script=$(dirname $0)'/viirs_edr_UseR_compare.Rnw'
R --slave --no-save --no-restore -e "require(knitr); knit('$script')" &> viirs_edr_UseR_compare.log
pdflatex viirs_edr_UseR_compare.tex
exit 0
我在* viirs_edr_UseR_compare.Rnw *中使用Sys.getenv()
来提取我想要传递的参数,例如 CSPP_VIIRS_EDR_REFERENCE_DIR 。
答案 0 :(得分:4)
您可以编写R脚本而不是bash脚本:
library(knitr)
args <- commandArgs(TRUE)
if (length(args) < 2) stop("Bad args, usage refdir cmpdir")
refdir <- args[1]
cmpdir <- args[2]
knit2pdf('my_script.Rnw')
\documentclass{article}
\begin{document}
refdir=\Sexpr{refdir}
cmpdir=\Sexpr{cmpdir}
\end{document}
然后你像这样启动它:
Rscript my_script_launcher.R foo bar
答案 1 :(得分:1)
我遇到了同样的问题,最后使用了以下命令(使用make
):
# set parameters
P1=some parameter
P2=some other parameter
# top target
all : report.html
# convert Markdown to HTML
%.html : %.md
Rscript -e 'require(markdown);markdownToHTML("$<","$@")'
# knit Rmd passing parameters
%.md : %.Rmd
Rscript -e 'param1<-$(P1);param2<-$(P2);require(knitr);knit("$<")'
在report.Rmd
我可以在代码块中使用str(c(param1,param2))
,运行make
会生成包含chr [1:2] "some parameter" "some other parameter"
的HTML文件。
如果您没有使用make
,只需指定knit
的方式以及获取参数的位置,我就可以帮助您根据需要调整解决方案。