Ortak kodu ayrı bir R dosyasına ayırın ve ardından bu R dosyasını, içinde olmasını istediğiniz her Rmd dosyasına kaynaklayın.
Örneğin, hazırlamam gereken iki rapor olduğunu varsayalım, Grip Salgınları ve Silahlar ve Tereyağı Analizi. Doğal olarak iki Rmd belgesi oluşturup onunla işim biterdi.
Şimdi, patronun gelip Grip Salgınları ile Tereyağı fiyatlarının varyasyonlarını görmek istediğini varsayalım (9 mm cephaneyi kontrol ediyor).
- Raporları analiz etmek için kodu kopyalayıp yeni rapora yapıştırmak, kodun yeniden kullanımı vb. İçin kötü bir fikirdir.
- Güzel görünmesini istiyorum.
Çözümüm, projeyi şu dosyalara dahil etmekti:
- Grip.Rmd
- Guns_N_Butter.Rmd
- guns_data_import.R
- butter_data_import.R
her Rmd dosyasında şöyle bir şey olurdu:
```{r include=FALSE}
source('flu_data_import.R')
```
Buradaki sorun, tekrarlanabilirliği kaybetmemizdir. Buna çözümüm, her Rmd dosyasına dahil edilecek ortak bir alt belge oluşturmaktır. Oluşturduğum her Rmd dosyasının sonuna şunu ekliyorum:
```{r autodoc, child='autodoc.Rmd', eval=TRUE}
```
Ve tabii ki autodoc.Rmd:
Source Data & Code
----------------------------
<div id="accordion-start"></div>
```{r sourcedata, echo=FALSE, results='asis', warnings=FALSE}
if(!exists(autodoc.skip.df)) {
autodoc.skip.df <- list()
}
#Generate the following table:
for (i in ls(.GlobalEnv)) {
if(!i %in% autodoc.skip.df) {
itm <- tryCatch(get(i), error=function(e) NA )
if(typeof(itm)=="list") {
if(is.data.frame(itm)) {
cat(sprintf("### %s\n", i))
print(xtable(itm), type="html", include.rownames=FALSE, html.table.attributes=sprintf("class='exportable' id='%s'", i))
}
}
}
}
```
```{r allsource, echo=FALSE, results='asis', warning=FALSE, cache=FALSE}
fns <- unique(c(compact(llply(.data=llply(.data=ls(all.names=TRUE), .fun=function(x) {a<-get(x); c(normalizePath(getSrcDirectory(a)),getSrcFilename(a))}), .fun=function(x) { if(length(x)>0) { x } } )), llply(names(sourced), function(x) c(normalizePath(dirname(x)), basename(x)))))
for (itm in fns) {
cat(sprintf("#### %s\n", itm[2]))
cat("\n```{r eval=FALSE}\n")
cat(paste(tryCatch(readLines(file.path(itm[1], itm[2])), error=function(e) sprintf("Could not read source file named %s", file.path(itm[1], itm[2]))), sep="\n", collapse="\n"))
cat("\n```\n")
}
```
<div id="accordion-stop"></div>
<script type="text/javascript">
```{r jqueryinclude, echo=FALSE, results='asis', warning=FALSE}
cat(readLines(url("http://code.jquery.com/jquery-1.9.1.min.js")), sep="\n")
```
</script>
<script type="text/javascript">
```{r tablesorterinclude, echo=FALSE, results='asis', warning=FALSE}
cat(readLines(url("http://tablesorter.com/__jquery.tablesorter.js")), sep="\n")
```
</script>
<script type="text/javascript">
```{r jqueryuiinclude, echo=FALSE, results='asis', warning=FALSE}
cat(readLines(url("http://code.jquery.com/ui/1.10.2/jquery-ui.min.js")), sep="\n")
```
</script>
<script type="text/javascript">
```{r table2csvinclude, echo=FALSE, results='asis', warning=FALSE}
cat(readLines(file.path(jspath, "table2csv.js")), sep="\n")
```
</script>
<script type="text/javascript">
$(document).ready(function() {
$('tr').has('th').wrap('<thead></thead>');
$('table').each(function() { $('thead', this).prependTo(this); } );
$('table').addClass('tablesorter');$('table').tablesorter();});
//need to put this before the accordion stuff because the panels being hidden makes table2csv return null data
$('table.exportable').each(function() {$(this).after('<a download="' + $(this).attr('id') + '.csv" href="data:application/csv;charset=utf-8,'+encodeURIComponent($(this).table2CSV({delivery:'value'}))+'">Download '+$(this).attr('id')+'</a>')});
$('#accordion-start').nextUntil('#accordion-stop').wrapAll("<div id='accordion'></div>");
$('#accordion > h3').each(function() { $(this).nextUntil('h3').wrapAll("<div>"); });
$( '#accordion' ).accordion({ heightStyle: "content", collapsible: true, active: false });
</script>
NB, bu Rmd -> html iş akışı için tasarlanmıştır. Lateks veya başka bir şeyle giderseniz bu çirkin bir karışıklık olacaktır. Bu Rmd belgesi, tüm kaynak () 'ed dosyaları için küresel ortama bakar ve bunların kaynağını belgenizin sonunda içerir. Jquery ui, tableorter içerir ve belgeyi, kaynaklı dosyaları göstermek / gizlemek için bir akordeon stili kullanacak şekilde ayarlar. Devam eden bir çalışmadır, ancak kendi kullanımlarınıza uyarlamaktan çekinmeyin.
Tek satırlık değil, biliyorum. Umarım size en azından bazı fikirler verir :)
Rmd
dosyaya kaynaklayabilirsiniz. Ama diğermarkdown
dosyalarda örülen bir dosyaya kaynak mı eklemek istiyorsunuz ?