R Markdown 기초

YAML Header, 마크다운(Markdown) 텍스트, R 코드 청크(chunk) 그리고 그림과 테이블을 중심으로, R 코드와 분석 결과가 포함된 문서를 작성하는 방법을 정리하였습니다.

lecture
markdown
Author
Affiliation

Zarathu Co.,Ltd

Published

January 28, 2019

김진섭 대표는 1월 28일(월) 성균관의대 사회의학교실를 방문, R Markdown으로 R 코드와 분석 결과가 포함된 문서를 작성하는 방법을 강의할 예정입니다. 강의 내용을 미리 공유합니다.

시작하기 전에

R MarkdownR 코드와 분석을 포함한 컨텐츠를 만드는 툴이며 크게 3가지 활용법이 있다.

  1. 문서(pdf, html, docx): 글쓰기, 분석 결과, 참고문헌 등 논문의 모든 작업을 R Markdown으로 수행한다.

  2. 프리젠테이션(pdf, html, pptx): R 코드나 분석결과가 포함된 프리젠테이션을 만든다. 기본 템플릿1 외에 xaringan2 패키지가 최근 인기를 끌고 있다.

  3. 웹(html): 웹사이트나 블로그를 만든다. blogdown3 이나 distill4 패키지가 대표적이다. 이 글의 블로그도 distill로 만들었으며, 과거 차라투 홈페이지는 blogdown을 이용하였다.

본 강의는 1의 가장 기초에 해당하는 강의로 간단한 문서를 작성하는 것을 목표로 한다. pdf 문서를 만들기 위해서는 추가로 LaTeX 문서작성 프로그램인 Tex Live를 설치해야 하며 본 강의에서는 생략한다.

Rmd 문서 시작하기

R MarkdownRmd 파일로 작성되며 rmarkdown5 패키지를 설치한 후, Rstudio에서 File \(\rightarrow\) New File \(\rightarrow\) R markdown… 의 순서로 클릭하여 시작할 수 있다(Figure @ref(fig:rmdfilemenu), @ref(fig:rmdstart)).

Rstudio File 메뉴6

R markdown 시작 메뉴7

문서의 제목과 저자 이름을 적은 후 파일 형태를 아무거나 고르면(나중에도 쉽게 수정 가능) Figure @ref(fig:rmdfile)처럼 확장자가 Rmd인 문서가 생성될 것이다.

R markdown 기본 문서8

파일 내용을 보면 맨 먼저 제목을 쓰는 부분이 있고 글과 코드를 작성하는 부분도 있다. 일단 이 파일을 문서로 만들어보자. 문서 이름이 있는 바로 아래의 knit 탭을 누르거나, 그 옆의 아래방향 화살표를 누르고 원하는 파일 형태를 클릭하면 된다(Figure @ref(fig:knittab)). 처음에 언급했듯이 pdfTex Live를 설치한 후 이용할 수 있다.

knit 탭9

다음은 각각 html, pdf, docx로 생성된 문서이다.

html 문서10

pdf 문서11

word 문서12

생각보다 간단하지 않은가? 이제 본격적으로 Rmd 파일의 내용을 살펴보면서 어떻게 글과 R 코드를 작성하는지 알아보자. Rmd는 크게 제목을 적는 YAML Header, 글을 쓰는 Markdown Text와 코드를 적는 Code Chunk로 나눌 수 있다(Figure @ref(fig:rmdcontents)).

Rmd 파일 구성13

YAML Header

YAMLYAML Ain’t Markup Language의 재귀형식의 이름을 갖고 있는 언어로 가독성에 초점을 두고 개발되었다. R MarkdownRmd의 시작 부분에 문서 형식을 설정하는 용도로 이 포맷을 이용한다. 다음은 기초 정보만 포함된 YAML이다.

---
title: "R Markdown 기초"
author: "김진섭"
date: "2022-08-23"
output: html_document
---

Knit 버튼 오른쪽의 설정() \(\rightarrow\) Output Options…를 클릭하여 html, pdf, word 포맷 각각에 대한 기본 설정을 할 수 있다(Figure @ref(fig:outputoption), @ref(fig:outputhtml)).

Output Options14

HTML Option15

설정을 마치면 업데이트 된 YAML을 볼 수 있다. 모든 포맷 공통인 설정값은

  1. toc(yes or no): 목차 포함 여부

  2. 그림의 높이(fig_height)넓이(fig_width): R 코드로 만든 그림에는 해당되지 않는다. Figures 에서 다시 설명하겠다.

이며, 자동으로 현재 날짜를 입력하려면 아래와 같이 `r format(Sys.Date())`를 이용하면 된다.

---
title: "R Markdown 기초"
subtitle: "성균관의대 강의 2019"
author: "김진섭"
date: "`r format(Sys.Date())`" 
---

아래는 필자가 Rmd 문서를 만들 때 흔히 쓰는 YAML 설정이다.

---
title: "R Markdown 기초"
subtitle: "성균관의대 강의 2019"
author: "김진섭"
date: "`r format(Sys.Date())`"
output:
  html_document:
    fig_height: 6
    fig_width: 10
    highlight: textmate
    theme: cosmo
    toc: yes
    toc_depth: 3
    toc_float: yes
  pdf_document:
    fig_height: 6
    fig_width: 10
    toc: no
  word_document:
    fig_height: 6
    fig_width: 9
    toc: no
---

htmltheme16에서 테마, highlight17에서 글씨 강조 스타일을 설정할 수 있으며, toc_float 옵션으로 움직이는 목차를 만들 수 있다(@ref(fig:tocfloat)).

toc_float- 움직이는 목차18

docx는 미리 설정을 마친 docx 문서를 아래와 같이 YAML에 추가하여 템플릿으로 이용할 수 있다.

---
title: "R Markdown 기초"
author: "김진섭"
date: "2022-08-23"
output: 
    word_document:
      reference_docx: mystyles.docx
---

docx에 대한 자세한 내용은 Rstudio 블로그19를 참고하기 바란다.

Markdown 글쓰기

R Markdown은 이름에서 알 수 있듯이 마크다운(Markdown) 을 기반으로 만들어졌다. 마크다운은 문법이 매우 간단한 것이 특징으로 깃허브README.md가 대표적인 마크다운 문서이다. 아래의 [R markdown reference]20에 흔히 쓰는 문법이 정리되어 있다.

2 가지만 따로 살펴보겠다.

Inline R code

문장 안에 분석 결과값을 적을 때, 분석이 바뀔 때마다 바뀐 숫자를 직접 수정해야 한다. 그러나 숫자 대신 `r <코드>` 꼴로 R 코드를 넣는다면 재분석시 그 숫자를 자동으로 업데이트 시킬 수 있다.

There were  `r nrow(cars)` cars studied

There were 50 cars studied

수식

LaTeX 문법을 사용하며 hwp 문서의 수식 편집과 비슷하다. inline 삽입은 $...$, 새로운 줄은 $$...$$ 안에 식을 적으면 된다.

This summation expression $\sum_{i=1}^n X_i$ appears inline.

This summation expression \(\sum_{i=1}^n X_i\) appears inline.

$$
\sigma = \sqrt{ \frac{1}{N} \sum_{i=1}^N (x_i -\mu)^2}
$$

\[\sigma = \sqrt{ \frac{1}{N} \sum_{i=1}^N (x_i -\mu)^2}\]

수식 전반은 LaTeX math and equations21을 참고하기 바란다.

R chunk

Rmd 문서에서 R 코드가 들어가는 방식은 4가지이다.

  1. 몰래 실행. 코드와 결과는 다 숨긴다 - 최초 설정 때 쓰임.

  2. 실행. 코드와 결과를 모두 보여준다.

  3. 실행. 코드는 숨기고 결과만 보여준다.

  4. 실행하지 않음. 코드 보여주기만 한다.

하나씩 살펴보도록 하자.

최초 설정

문서를 처음 생성했을 때 최초로 보이는 R 코드는 다음과 같다.

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

include=FALSE 옵션으로 문서에는 포함시키지 않고 몰래 실행할 수 있으며, 주로 최초 설정에 이용된다. setup은 이 코드에 해당하는 라벨로 생략 가능하다. knitr::opts_chunk$set 에서 디폴트 옵션을 설정할 수 있으며 echo = TRUE는 코드를 보여준다는 뜻이다. 흔히 쓰는 옵션들은 아래와 같다.

  • eval=F - 코드를 실행하지 않는다.
  • echo=F - 코드를 보여주지 않는다.
  • include=F - 실행 결과를 보여주지 않는다.
  • message=F - 실행 때 나오는 메세지를 보여주지 않는다.
  • warning=F - 실행 때 나오는 경고를 보여주지 않는다.
  • error=T - 에러가 있어도 실행하고 에러코드를 보여준다.
  • fig.height = 7 - 그림 높이, R로 그린 그림에만 해당한다.
  • fig.width = 7 - 그림 너비, R로 그린 그림에만 해당한다.
  • fig.align = 'center' - 그림 위치, R로 그린 그림에만 해당한다.

다음은 필자가 논문을 Rmd로 쓸 때 흔히 쓰는 디폴트 옵션이다.

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo=F, fig.align = "center", message=F, warning=F, fig.height = 8, cache=T, dpi = 300, dev = "jpg")
```

전체 옵션은 knitr::opts_chunk$get 함수로 확인할 수 있다.

knitr::opts_chunk$get()
$eval
[1] TRUE

$echo
[1] FALSE

$results
[1] "markup"

$tidy
[1] FALSE

$tidy.opts
NULL

$collapse
[1] FALSE

$prompt
[1] FALSE

$comment
[1] NA

$highlight
[1] TRUE

$size
[1] "normalsize"

$background
[1] "#F7F7F7"

$strip.white
[1] TRUE

$cache
[1] FALSE

$cache.path
[1] "index_cache/html/"

$cache.vars
NULL

$cache.lazy
[1] TRUE

$dependson
NULL

$autodep
[1] FALSE

$cache.rebuild
[1] FALSE

$fig.keep
[1] "high"

$fig.show
[1] "asis"

$fig.align
[1] "center"

$fig.path
[1] "index_files/figure-html/"

$dev
[1] "png"

$dev.args
NULL

$dpi
[1] 96

$fig.ext
NULL

$fig.width
[1] 7

$fig.height
[1] 5

$fig.env
[1] "figure"

$fig.cap
NULL

$fig.scap
NULL

$fig.lp
[1] "fig:"

$fig.subcap
NULL

$fig.pos
[1] ""

$out.width
NULL

$out.height
NULL

$out.extra
NULL

$fig.retina
[1] 2

$external
[1] TRUE

$sanitize
[1] FALSE

$interval
[1] 1

$aniopts
[1] "controls,loop"

$warning
[1] TRUE

$error
[1] FALSE

$message
[1] TRUE

$render
NULL

$ref.label
NULL

$child
NULL

$engine
[1] "R"

$split
[1] FALSE

$include
[1] TRUE

$purl
[1] TRUE

$fenced.echo
[1] FALSE

$ft.shadow
[1] FALSE

Chunk 별 설정

최초 설정 이후부터는 아래와 같이 간단하게 코드를 보여주거나 실행할 수 있다.

```{r}
head(mtcars)
```
head(mtcars)

기본 설정과 다른 옵션을 적용하려면 chunk에 옵션을 따로 적으면 된다. 예를 들어 코드는 숨기고 결과만 보여주려면 echo=F 를 추가하면 된다.

```{r, echo=F}
head(mtcars)
```

반대로 실행은 안하고 코드만 보여주려면 eval=F를 추가하면 된다.

```{r, eval=F}
head(mtcars)
```
head(mtcars)

Figures

Rmd 문서에 그림이 들어가는 방법은 2가지가 있다.

  1. R 코드로 생성 : plot 함수, ggplot2 패키지 등

  2. 외부 그림 삽입

앞서도 언급했듯이 주의할 점은 그림이 만들어지는 방법에 따라 서로 다른 옵션이 적용된다는 것이다. 일단 전자부터 살펴보자.

Figures with R

R 코드에서 자체적으로 만든 그림은 전부 chunk 옵션의 지배를 받아 간단하다.

```{r, fig.cap = "scatterplot: cars", fig.width = 8, fig.height = 6}
plot(cars, pch = 18)
```
plot(cars, pch = 18)

scatterplot - cars

External figures

외부 그림은 R 코드로도 삽입할 수 있고 마크다운 문법을 쓸 수도 있는데, 어떤 방법을 쓰느냐에 따라 다른 옵션을 적용받는다는 것을 주의해야 한다. R에서는 knitr::include_graphics 함수를 이용하여 그림을 넣을 수 있고 이 때는 chunk 내부의 옵션이 적용된다.

```{r, fig.cap = "tidyverse logo", fig.align = "center"}
library(knitr)
include_graphics("https://www.tidyverse.org/images/tidyverse-default.png")
```

tidyverse logo

같은 그림을 chunk없이 바로 마크다운에서 삽입할 수도 있다. 이 때는 YAML의 옵션이 적용된다.

![tidyverse logo](https://www.tidyverse.org/images/tidyverse-default.png){ width=50% }

tidyverse logo

{ width=50% } 는 그림의 크기를 조절하는 옵션이며 R chunk에서도 같은 옵션 out.width="50%"이 있다. 위치를 가운데로 조절하려면 <center>...</center> 를 포함시키자.

<center>
![tidyverse logo](https://www.tidyverse.org/images/tidyverse-default.png){ width=50% }
</center>

tidyverse logo

개인적으로는 외부 이미지도 chunk 내부에서 읽는 것을 추천한다. chunk 내부의 옵션들이 마크다운의 그것보다 훨씬 체계적이고 쉬운 느낌이다.

Tables

논문을 쓸 때 가장 귀찮은 부분 중 하나가 분석 결과를 테이블로 만드는 것으로, knitr::kable() 함수를 쓰면 문서 형태에 상관없이 Rmd에서 바로 테이블을 만들 수 있다. 아래는 데이터를 살펴보는 가장 간단한 예시이다.

```{r}
kable(iris[1:5, ], caption = "A caption")
```
A caption
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa

epiDisplay 패키지의 regress.display, logistic.display 함수를 활용하면 회귀분석의 결과를 바로 테이블로 나타낼 수 있다(Table @ref(tab:regtable)).

```{r}
mtcars$vs <- as.factor(mtcars$vs)
mtcars$cyl <- as.factor(mtcars$cyl)

model <- glm(mpg ~ disp + vs + cyl, data = mtcars)
model.display <- epiDisplay::regress.display(model, crude = T, crude.p.value = T)
model.table <- model.display$table[rownames(model.display$table)!="", ]
kable(model.table, caption = model.display$first.line)
```
Linear regression predicting mpg
crude coeff.(95%CI) crude P value adj. coeff.(95%CI) P(t-test) P(F-test)
disp (cont. var.) -0.04 (-0.05,-0.03) < 0.001 -0.03 (-0.05,0) 0.019 < 0.001
vs: 1 vs 0 7.94 (4.6,11.28) < 0.001 0.04 (-3.81,3.89) 0.984 0.334
cyl: ref.=4 0.041
6 -6.92 (-10.11,-3.73) < 0.001 -4.77 (-8.56,-0.98) 0.016
8 -11.56 (-14.22,-8.91) < 0.001 -4.75 (-12.19,2.7) 0.202

테이블을 좀 더 다듬으려면 kableExtra 패키지가 필요하며, 자세한 내용은 cran 설명서22를 참고하기 바란다. html 문서의 경우 kable()외에도 다양한 함수들을 이용할 수 있는데, 대표적인 것이 rmarkdown::paged_table() 함수와 DT 패키지이다. 전자는 아래와 같이 YAML에서 테이블 보기의 기본 옵션으로 설정할 수도 있다.

---
title: "Motor Trend Car Road Tests"
output:
  html_document:
    df_print: paged
---

DT 패키지에 대한 설명은 Rstudio DT 홈페이지23를 참고하기 바란다.

마치며

본 강의를 통해 R Markdown으로 기본적인 문서를 만드는 법을 알아보았다. 본 강의에서는 시간 관계상 참고문헌 다는 법을 언급하지 않았는데 궁금하다면 Bibliographies and Citations24을 참고하자. 이 내용까지 숙지한다면 R Markdown으로 논문을 쓸 준비가 된 것이다. R Markdown에 대한 전반적인 내용은 아래의 R Markdown Cheet Sheet25에 잘 요약되어 있으니 그때그떄 확인하면 좋다.

Footnotes

  1. https://rmarkdown.rstudio.com/lesson-11.html↩︎

  2. https://github.com/yihui/xaringan↩︎

  3. https://github.com/rstudio/blogdown↩︎

  4. https://rstudio.github.io/distill/↩︎

  5. https://github.com/rstudio/rmarkdown↩︎

  6. https://rachaellappan.github.io/rmarkdown/↩︎

  7. https://rachaellappan.github.io/rmarkdown/↩︎

  8. https://aberdeenstudygroup.github.io/studyGroup/lessons/SG-T5-RMarkdown/Images/New_Markdown_v2.png↩︎

  9. https://rstudioblog.files.wordpress.com/2014/06/r-markdown-formats.png↩︎

  10. https://stackoverflow.com/questions/47317229/rmarkdown-knit-pdf-to-look-exactly-like-html↩︎

  11. https://stackoverflow.com/questions/47317229/rmarkdown-knit-pdf-to-look-exactly-like-html↩︎

  12. https://rmarkdown.rstudio.com/articles_docx.html↩︎

  13. https://rfriend.tistory.com/311↩︎

  14. https://richardlent.github.io/post/rstudio-as-a-research-and-writing-platform/↩︎

  15. https://stackoverflow.com/questions/24934781/rstudio-knitr-themes↩︎

  16. http://www.datadreaming.org/post/r-markdown-theme-gallery/↩︎

  17. https://eranraviv.com/syntax-highlighting-style-in-rmarkdown/↩︎

  18. https://rfriend.tistory.com/311↩︎

  19. https://rmarkdown.rstudio.com/articles_docx.html↩︎

  20. https://www.rstudio.com/wp-content/uploads/2015/03/rmarkdown-reference.pdf↩︎

  21. https://www.latex-tutorial.com/tutorials/amsmath/↩︎

  22. https://cran.r-project.org/web/packages/kableExtra/vignettes/awesome_table_in_html.html↩︎

  23. https://rstudio.github.io/DT/↩︎

  24. https://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html↩︎

  25. https://github.com/rstudio/cheatsheets/raw/master/rmarkdown-2.0.pdf↩︎

Citation

BibTeX citation:
@online{kim2019,
  author = {Jinseob Kim},
  title = {R {Markdown} {기초}},
  date = {01/28/2019},
  url = {https://blog.zarathu.com/posts/2019-01-03-rmarkdown},
  langid = {en}
}
For attribution, please cite this work as:
Jinseob Kim. 1AD–28AD. “R Markdown 기초.” 1AD–28AD. https://blog.zarathu.com/posts/2019-01-03-rmarkdown.