2016-08-16 13 views
0

A previous post on StackOverflow имеет очень полезное руководство по использованию шаблона. Rnw-файл для создания нескольких отчетов. Я хотел бы дублировать это, за исключением того, что у меня было бы 4 цикла, а не только те, которые использовались в этом примере.Knitr: Используйте вложенные циклы для генерации нескольких отчетов

В моем случае, это петли, которые я использую для создания отчетов:

  • внешний цикл: цикл по вектору, который содержит имена переменных, которые я хочу проанализировать

  • внутренние 3 петли: зацикливания через различные сезоны/географические локации

Вот пример кода шаблона, который работает без каких-либо проблем, когда я Поставляем все необходимые переменные, которые будут предоставляться в петлях:

\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')) 

б у Я получаю следующее сообщение об ошибке, вероятно, из-за того, что у меня есть несколько уровней петель, которые все используют одни и те же имена ломтя меток в качестве ссылок на цифры:

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

Может кто-то пожалуйста, объясните это сообщение об ошибке ? Нужно ли мне каким-то образом изменять имена ярлыков, чтобы они различались между каждым циклом? Или я должен реализовать три внутренних цикла в файле шаблона? Или, возможно, объединить все .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_child', если вы используете' knit_expand'. – Tutuchan

ответ

1

У меня есть решение! Некоторые примечания:

1) файл шаблона не может иметь теги \begin{document}...\end{document} или что-либо в преамбуле, это должно быть в главном файле .Rnw.

2) Начиная с этого момента он работает только для одной переменной (а не зацикливания над вектором переменных), но тривиальным вопросом является масштабирование.

Так вот пример шаблона:

<<{{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} 

Я хотел бы отметить, что вдохновение пришло из раздела knitr-примеров, в частности this one.