2016-08-16 11 views
0

previous post on StackOverflowはテンプレート.Rnwファイルを使用して複数のレポートを作成する方法に関する非常に有用なガイドを持っていました。私は、例で使用されているものよりもむしろ4つのループを持つことを除いて、これを複製したいと思います。私の場合はKnitr:複数のレポートを生成するためにネストループを使用

、これらは私がレポートを生成するために使用しているループは、次のとおりです。

  • 最も外側のループ:私は

  • を分析する変数の名前を含むベクターをループ
  • インナーループ3:異なる季節をループ/地理的位置

ここI問題なく動作するテンプレートコードのサンプルであります供給ループに提供される必要なすべての変数:私の出力を見ることができることの便宜上

\begin{document} 
This is a test in which the \texttt{\Sexpr{varname}} variable is used in this report. If successful, further reports can be generated using a loop with this same script! 

First, a plot of the CDFs, with Kolmogorov-Smirnov statistics: 
\begin{figure}[h] 
\centering 
<<cdf-plots,dev='png',out.width='0.5\\linewidth',echo=FALSE,warning=FALSE,fig.align='centering'>>= 
chart_stats(varname,data_vec,labs,season,s,h,colvec=colvec,cdf_plot=TRUE) 
cap1=paste('Cumulative distribution functions for the counts,',season,s,h) 
@ 
\caption{\Sexpr{cap1}} 
\end{figure} 
<<ks_calc,warning=FALSE,results='asis',echo=FALSE>>= 
library(xtable) 
ks=chart_stats(varname,data_vec,labs,season,s,h,ks_test=TRUE,dval=TRUE) 
cap=paste('D-values for',season,h,s) 
print(xtable(ks,caption=cap)) 
@ 

示すように、各ファイルが現在別.texファイルとして生成される。

library(knitr) 
setwd("~/data_netcdf") 
load("loaded_data.Rdata") 
source("~/tempestextremes/test/chart_stats.R") 

data_vec<-c("ERA", "climo", "2xCO2","SSTplus2","SSTplus2_2xCO2") 

seasons_vec<-c("DJF","JJA","MAM","SON") 
sec=c("ATL","PAC") 
hemi=c("NH","SH") 
var=c('centlat','centlon','area') 

for (varname in var){ 
    } 
    for (season in seasons_vec){ 
    for (h in hemi){ 
     for (s in sec){ 
     output_name=paste(varname,'_',season,'_',h,'_',s,'_report.tex',sep="") 
     knit2pdf("~/data_netcdf/report_test.Rnw",output=output_name) 
     } 
    } 
    } 
} 

あり子ファイルの使用は、私が何をしたいのですが何に似て聞こえる一つの文書の中に出力を結合することができknitr例であり、ここで私が試したものです:

<<test-main,include=FALSE>>= 
[removed for length] 

#testing on just one variable name 
var=c('centlat') 
for (varname in var){ 
    out=NULL 
    for (season in seasons_vec){ 
    for (h in hemi){ 
     for (s in sec){ 
     out=c(out,knit_child("~/data_netcdf/report_test.Rnw")) 
     } 
    } 
    } 
} 
@ 

\Sexpr(paste(out,collapse='\n')) 

B

Error in parse_block(g[-1], g[1], params.src) : 
    duplicate label 'cdf-plots' 
Calls: knit ... process_file -> split_file -> lapply -> FUN -> parse_block 

は誰か、このエラーメッセージを説明していただけます:UTは私はおそらく、私はすべての図のための参照と同じチャンクのラベル名を使用しているループの複数のレベルを持っているという事実のために、次のエラーを取得しています?私は何とかラベル名を変更して、ループするたびに区別する必要がありますか?テンプレートファイル内に3つの内部ループを実装する必要がありますか?あるいは、事実の後でおそらくすべての.texファイルを組み合わせるでしょうか?

私はこのための最良のワークフローを理解するのに助けていただければ幸いです。

+1

ループするたびにラベル名が異なるようにラベル名を区別する必要があります。これがあなたを助けてくれますか?http://stackoverflow.com/questions/12095113/r-knitr-possible-to-programmatically-modify-chunk-labels? – Tutuchan

+0

私は 'knit_expand'を使ってループ内で設定した' prefix'変数を正常に評価しましたが、 'knit_child'とどのように組み合わせるのか分かりません(あるいは' knit_child ')。何かご意見は? – pianoplunkster

+1

解決策を見つけたように見えます!ですから、あなたが見たように、 'knit_expand'を使うなら' knit_child'は必要ありません。 – Tutuchan

答えて

1

私は解決策を考え出しました。メモ:

1)テンプレートファイルには、\begin{document}...\end{document}タグなどのプリアンブルを含めることはできません。これは、メインの.Rnwファイルに記述する必要があります。

2)この時点では、(変数のベクトルをループするのではなく)1つの変数に対してのみ機能しますが、これをスケールアップするのは簡単なことです。だからここ

は、テンプレートの例である:

<<{{prefix}}-setup>>= 
varname='{{varname}}' 
season='{{season}}' 
h='{{h}}' 
s='{{s}}' 
@ 

First, a plot of the CDFs, with Kolmogorov-Smirnov statistics: 
\begin{figure}[h] 
\centering 
<<'{{prefix}}-cdf-plots',dev='png',fig.lp='{{prefix}}',out.width='0.5\\linewidth',echo=FALSE,warning=FALSE,fig.align='centering'>>= 
colvec=c("blue","red","green","purple","pink") 
chart_stats(varname,data_vec,labs,season,s,h,colvec=colvec,cdf_plot=TRUE) 
cap1=paste('Cumulative distribution functions for the counts,',season,s,h) 
@ 
\caption{\Sexpr{cap1}} 
\end{figure} 

そしてメイン文書:

\documentclass{article} 
\usepackage[margin=0.5in]{geometry} 
\begin{document} 

<<test-main,include=FALSE>>= 
library(knitr) 
setwd("~/data_netcdf") 
load("loaded_data.Rdata") 
source("~/tempestextremes/test/charts_stats.R") 
[other stuff] 
@ 
... 
<<generate-code,echo=FALSE>>= 
    varname='centlat' 
    out=NULL 
    for (season in seasons_vec){ 
    for (h in hemi){ 
     for (s in sec){ 
     prefix=paste(season,h,s,sep="_") 
     out=c(out,knit_expand("~/data_netcdf/report_test_1.Rnw")) 
     } 
    } 
    } 
@ 

\Sexpr{paste(knit(text=out),collapse='\n')} 
\end{document} 

私はインスピレーションは、具体的this one、knitr-例のセクションから来たことに注意してください。

関連する問題