knitr로 보고서 생성하기

Overview

Teaching: 60 min
Exercises: 15 min
Questions
  • 소프트웨어와 보고서를 어떻게 통합할 수 있을까?

Objectives
  • 재현가능한 보고서 가치

  • 마크다운 기초

  • R 코드 덩어리(R code chunks)

  • 덩어리 선택옵션(Chunk options)

  • 인라인(Inline) R 코드

  • 기타 출력 포맷

데이터 분석 보고서

데이터 분석가는 동료 혹은 향후 참고자료로 자신의 작업결과를 문서화하는데 상당량의 보고서를 작성해서 분석과정과 출력결과를 기술한다.

처음 작업을 시작할 때, 온전히 본인 작업을 위해서 R 스크립트를 작성한다. 그리고 나서, 다양한 그래프가 첨부된 분석결과를 기술해서 동료에게 전자우편을 발송한다. 분석결과를 논의하는 과정에서 어느 그래프를 지칭하지에 대해 혼란이 종종 수반된다.

워드나 $\LaTeX$으로 좀더 정형화된 보고서로 옮겨가도, 그림이 올바르게 보이도록 만드는데 상당한 시간을 소비한다. 대부분 페이지 나누기가 문제가 된다.

웹페이지(html 파일)를 생성하게 되면 모든 것이 훨씬 수월해진다. 이유는 하나의 긴 흐름이 되기 때문이다. 따라서, 한 페이지에 맞지 않는 긴 그림도 사용할 수 있게 된다. 스크롤링이 딱맞는 친구다.

문학적 프로그래밍(literate programming)

이상적으로 그런 분석 보고서가 재현가능한 문서가 된다: 만약 오류가 발견되거나, 추가적인 분석주제가 데이터에 추가되면, 다시 재컴파일 하게 되면, 신규 혹은 수정된 결과를 얻게 된다. (반대로, 워드나 한글 등 오피스로 작업하게 되면 그림을 다시 생성하고나서 문서에 붙여넣고 수작업으로 상세결과를 편집해야 한다.)

R에서 문학적 프로그래밍을 구현하는 주된 도구가 knitr다. knitr는 텍스트와 R 코드가 뒤썩인 문서를 생성할 수 있게 하는 역할을 수행한다. 문서가 knitr로 처리되면, R 코드가 실행되어 그래프와 분석결과가 문서에 삽입된다.

이런 유형의 아이디어를 문학적 프로그래밍(literate programming)이라고 부른다.

knitr는 R코드 뿐만 아니라 다양한 프로그래밍 언어를 텍스트와 뒤섞을 수 있도록 하지만, 기본적으로 R 마크다운을 추천한다. R 마크다운은 마크다운과 R코드를 섞어 쓸 수 있도록 한다. 마크다운은 가벼운 마크업 언어로 웹페이지를 생성하는데 사용된다.

R 마크다운 파일 생성하기

RStudio 에서 File → New File → R Markdown 을 클릭하면 다음과 같은 대화상자가 열린다:

기본설정(HTML 출력)된 대로 사용할 수도 있지만, 제목을 줄 수도 있다.

R 마크다운 기본 구성요소

초기 설정된 텍스트 덩어리에 R에 대한 지시사항이 담겨있다: 제목, 저자명, 날짜, html 출력물(다른 말로, 웹페이지)을 생성할지가 포함된다.

---
title: "Initial R Markdown document"
author: "Karl Broman"
date: "April 23, 2015"
output: html_document
---

원하지 않는 경우, 상기 필드를 임의로 삭제할 수 있다. 엄밀히 말해서 인용부호는 상기 경우에 필요한 것은 아니다. 제목에 콜론(:)이 포함되는 경우 대체로 인용부호가 필요하다.

RStudio에 시작을 도와주도록 예제가 문서에 포함되어 있다. 다음과 같은 R 코드 덩어리가 포함되어 있는 점을 주목한다:

```{r}
summary(cars)
```

knitr로 실행되는 R 코드 덩어리로 R 코드 실행결과로 치환된다. 뒤에서 더 다루게 된다.

또한, 웹주소는 < > 꺾쇠 기호로 담아내고, **Knit**처럼 별표 두개를 사용하기도 한다. 이것이 전형적인 Markdown 구문의 한 사례가 된다.

마크다운(Markdown)

HTML 코드로 작성하는 대신에 전자우편에서 문서를 작성하는 것처럼 텍스트에 마크업(markup)을 적용해서 웹페이지를 저작하는 시스템이 마크다운이다. 마크업 텍스트는 적절한 HTML코드로 치환되는 과정을 거쳐서 최종 HTML로 변환된다.

지금은 자동생성된 모든 코드를 삭제하고, 마크다운으로 저작을 시작해보자.

별표 두개를 사용해서 굵게(bold)할 수 있는데 **굵게(bold)** 텍스트를 타이핑하면 된다. 밑줄 혹은 별표 한개를 사용해서 이탤릭 도 구현가능한데, _이탤릭_ 텍스트를 타이핑하면 된다.

다음과 같이 하이픈 혹은 별표를 적용해서 블릿 기호가 붙은 항목을 생성할 수 있다:

* bold with double-asterisks
* italics with underscores
* code-type font with backticks

혹은 다음과 같이도 가능하다:

- bold with double-asterisks
- italics with underscores
- code-type font with backticks

다음과 같이 웹페이지로 보여지게 된다:

숫자를 사용하면 숫자가 붙은 항목도 생성이 가능하다. 원하는만큼 동일한 숫자를 반복해서 적용하면 된다:

1. bold with double-asterisks
1. italics with underscores
1. code-type font with backticks

다음과 같이 보이게 된다.

  1. bold with double-asterisks
  2. italics with underscores
  3. code-type font with backticks

# 기호를 각 라인 첫번째 적용하게 되면 다른 크기를 갖는 섹션 제목을 만들 수 있다:

# 아주 큰 제목(Title)
## 큰 제목(Main section)
### 작은 제목(Sub-section)
#### 아주 작은 제목(Sub-sub section)

좌측 상단에 “Knit HTML” 버튼을 클릭하면 R 마크다운 문서를 HTML 웹페이지로 _컴파일_하게 된다. 바로 옆에 작은 물음표가 있음에 주목한다; 클릭하게 되면 “Markdown Quick Reference” (마크다운 구문) 뿐만 아니라 RStudio IDE에서 R 마크다운 문서도 참고할 수 있다.

도전과제

R 마크다운 문서를 생성한다. 모든 R 코드 덩어리를 삭제하고 마크다운 문서를 작성한다. (제목, 이탤릭 텍스트, 블릿 기호가 붙은 항목 등)

문서를 웹페이지로 변환시킨다.

마크다운 한 걸음 더 들어갑니다.

[text to show](http://the-web-page.com)처럼 하이퍼링크를 걸 수도 있다.

![caption](http://url/for/file) 처럼 이미지를 삽입할 수도 있다.

F~2~ 처럼 아래 첨자를 F~2와 같이 넣을 수도 있도, F^2^ 처럼 윗첨자를 F^2^와 같이 넣을 수도 있다.

수식 작성법은 LaTeX을 참조해서 작성할 수 있는데, $ $$$ $$을 사용해서 수식을 넣을 수 있다: $E = mc^2$.

$$y = \mu + \sum_{i=1}^p \beta_i x_i + \epsilon$$

R 코드 덩어리

마크다운은 흥미롭고 유용하기도 하지만, 실제 진정한 힘은 마크다운을 R 코드 덩어리와 뒤섞어 사용할 때 나온다. R 마크다운으로 말이다. R 마크다운이 처리되면서 R 코드도 실행된다; 그림이 생성되는 경우, 최종 문서에 자동으로 그림이 삽입되어 들어간다.

데이터를 불러오는 R 코드는 다음과 같이 생겼다:

```{r load_data}
gapminder <- read.csv("~/Desktop/gapminder.csv")
```

즉, ```{r chunk_name}``` 사이에 R 코드 덩어리를 위치한다. R 코드 덩어리에 명칭을 부여하는 것이 좋은데 이유는 오류 수정을 유용하게 하고, 그래프가 생성되는 경우 파일명이 R 코드 덩어리에 지정한 명칭이 따라 붙기 때문이다.

도전과제

다음 R 코드를 추가한다.

  • ggplot2 팩키지 불러오는 코드
  • gapminder 데이터를 불러오는 코드
  • 그래프를 생성하는 코드

컴파일은 어떻게 되는가?

“Knit HTML” 버튼을 생성하게 되면, knitr 프로그램이 R 마크다운 문서를 처리해서, 일반 마크다운 문서가 생성된다(그림도 포함된다.): R 코드가 실행되면서 입력과 출력 모두에 대해 치환된다; 그림이 생성되는 경우, 그림에 대한 링크도 포함된다.

마크다운과 그림 문서는 pandoc 도구로 처리되어서, 마크다운 파일을 그림이 내장된 HTML 파일로 탈바꿈하게 된다.

plot of chunk rmd_to_html_fig

덩어리(Chunk) 선택옵션

코드 덩어리가 어떻게 처리되는 방법에 대한 선택옵션이 다수 지원된다.

다음과 같이 작성할 수도 있다:

```{r load_libraries, echo=FALSE, message=FALSE}
library("dplyr")
library("ggplot2")
```

전역 덩어리(chunk) 선택옵션을 사용하여 반복적으로 사용할 R마크다운 선택옵션을 다음과 같이 지정하는 것도 가능하다:

```{r global_options, echo=FALSE}
knitr::opts_chunk$set(fig.path="Figs/", message=FALSE, warning=FALSE,
                      echo=FALSE, results="hide", fig.width=11)
```

fig.path 선택옵션은 그림이 저장되는 장소를 지정하는데 사용한다. /이 중요한데 이유는 /을 지정하지 않으면 그림이 Figs으로 시작하는 파일명으로 표준 저장소에 저장된다.

작업 디렉토리에 R 마크다운 파일이 다수 존재하는 경우, fig.path를 사용해서 fig.path="Figs/cleaning-", fig.path="Figs/analysis-"처럼 그림 파일명에 접두어를 달리 지정할 수도 있다.

도전과제

그림 크기를 변경하고, 코드를 출력에서 감추도록, R 코드 덩어리 선택옵션을 설정해 본다.

인라인(Inline) R 코드

보고서의 모든 숫자를 재현가능하게 만들 수 있다. 인라인 코드를 작성할 때 `r`을 사용한다. 예를 들어, `r round(some_value, 2)`. R 코드가 실행되어 코드가 결과 값으로 치환된다.

두줄이상에 걸처 인라인 코드 덩어리가 나눠지도록 작성하지는 말자.

아마도, 조금 큰 코드 덩어리의 경우 include=FALSE(echo=FALSEresults="hide" 두가지 기능을 함께 보유)를 사용해서 연산과 정의를 처리하는 것도 가능하다.

이런 경우에 소수점 자리수에 대해서 2.0을 원하지만, round(2.03, 1)코드는 2가 된다.

R/broman 팩키지에서 myround 함수가 도움이 될 수 있다.

도전과제

인라인 R 코드를 작성해 보자.

기타 출력 선택옵션

R 마크다운 문서를 PDF나 워드 문서로 변환할 수도 있다. “Knit HTML” 버튼 옆에 작은 삼각형을 클릭하면 드롭다운 메뉴가 나타난다. 혹은 R 마크다운 .Rmd 파일의 헤더부분에 pdf_document, word_document으로 설정하면 된다.

Tip: PDF 문서 생성하기

.pdf 문서를 생성하려면 추가로 소프트웨어를 설치해야 한다. 소프트웨어 설치 없이 .pdf 문서를 생성하게 되면 오류 메시지에 자세한 사항이 기술되어 있다.

Resources

Key Points

  • R 마크다운으로 작성한 보고서와 R로 작성한 소프트웨어를 섞어쓴다.

  • 포맷을 제어하는데 덩어리 선택옵션(chunk options)으로 지정한다.

  • knitr 팩키지를 사용해서 문서를 PDF를 비롯한 다른 포맷으로 변환시킨다.