공통 코드를 별도의 R 파일로 추출한 다음 해당 R 파일을 원하는 각 Rmd 파일로 소싱하십시오.
예를 들어 제가 작성해야하는 두 가지 보고서, 독감 발생 및 총기 대 버터 분석이 있다고 가정 해 보겠습니다. 당연히 두 개의 Rmd 문서를 작성하고 완료합니다.
이제 보스가 와서 독감 발발 대 버터 가격 (9mm 탄약 제어)의 차이를보고 싶다고 가정 해 보겠습니다.
- 보고서를 새 보고서로 분석하기 위해 코드를 복사하고 붙여 넣는 것은 코드 재사용 등을 위해 나쁜 생각입니다.
- 멋지게 보이길 원합니다.
내 솔루션은 프로젝트를 다음 파일에 포함시키는 것입니다.
- 독감 Rmd
- Guns_N_Butter.Rmd
- guns_data_import.R
- butter_data_import.R
각 Rmd 파일에는 다음과 같은 내용이 있습니다.
```{r include=FALSE}
source('flu_data_import.R')
```
여기서 문제는 우리가 재현성을 잃는다는 것입니다. 이에 대한 나의 해결책은 각 Rmd 파일에 포함 할 공통 자식 문서를 만드는 것입니다. 따라서 내가 만드는 모든 Rmd 파일 끝에 다음을 추가합니다.
```{r autodoc, child='autodoc.Rmd', eval=TRUE}
```
그리고 물론 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, 이것은 Rmd-> html 워크 플로우를 위해 설계되었습니다. 라텍스 또는 다른 것을 사용하면 추악한 엉망이 될 것입니다. 이 Rmd 문서는 모든 source () 파일에 대한 전역 환경을 살펴보고 문서 끝에 해당 소스를 포함합니다. 여기에는 jquery ui, tablesorter가 포함되어 있으며 소스 파일을 표시 / 숨기기 위해 아코디언 스타일을 사용하도록 문서를 설정합니다. 진행중인 작업이지만 자신의 용도에 맞게 자유롭게 조정하십시오.
한 줄짜리가 아닙니다. 적어도 몇 가지 아이디어를 제공하기를 바랍니다. :)
Rmd
파일 로 쉽게 소싱 할 수 있습니다 . 그러나 다른markdown
파일의 소스를 파일로 만들고 싶 습니까?