12.3 R Code Chunks
- 실제 R code가 실행되는 부분임
- Code chunk 실행 시 다양한 옵션 존재(본 강의에서는 몇 개의 옵션만 다룰 것이며, 더 자세한 내용은 https://yihui.org/knitr/options/ 또는 R Markdown 레퍼런스 가이드 참조
- Code chunk는
```{r}
로 시작되며r
은 code 언어 이름을 나타냄. - Code chunk는
```
로 종료 - R Markdown 문서 작성 시 단축키
[Ctrl] + [Alt] + [I]
를 입력하면 Chunk 입력창이 자동 생성됨 - Code chunk의 옵션 조정을 통해 코드의 출력여부, 코드 출력 시 코드의 출력 형태, 코드의 결과물 출력 조정 가능
자주 활용하는 chunk 옵션
코드 실행 관련 청크
Chunk 옵션 | Default | 설명 |
---|---|---|
eval | TRUE | R 실행(코드 실행 결과)에 대응하는 결과 출력 여부 |
include | TRUE | 출력 문서에 코드 청크의 내용을 포함할지 여부 |
```{r ex01-1, eval=TRUE}
summary(iris)
hist(iris$Sepal.Length)
```
```{r ex01-2, eval=FALSE}
summary(iris)
hist(iris$Sepal.Length)
```
#청크 옵션 eval=TRUE
summary(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
Median :5.800 Median :3.000 Median :4.350 Median :1.300
Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
Species
setosa :50
versicolor:50
virginica :50
hist(iris$Sepal.Length)
#청크 옵션 eval=FALSE
summary(iris)
hist(iris$Sepal.Length)
소스 코드 출력(텍스트) 결과 관련 청크
Chunk 옵션 | Default | 설명 |
---|---|---|
echo | TRUE | R 실행 결과에 대응하는 코드 출력 여부 |
results | markup | 출력 결과 포맷 지정을 위한 옵션으로 추가적으로 3 가지 옵션 선택 가능: ‘hide’, ‘asis’, ‘hold’, ‘markup’ |
error | TRUE | 코드 또는 스크립트에 구문오류 메세지 출력 여부 |
message | TRUE | 코드로부터 생성된 메세지 출력 여부 |
warning | TRUE | 경고 메세지 출력 여부 |
echo
: 코드 청크에 작성한 R-script 출력 여부 결정echo = FALSE
이면 소스 코드 출력 없이 그림 결과만 출력
```{r ex01-2, echo=TRUE}
require(ggthemes) # ggtheme 패키지 불러오기
require(ggpubr) # ggpubr 패키지 불러오기
iris %>%
ggplot(aes(x = Sepal.Length, y = Petal.Width, color = Species)) +
geom_point(size = 5) +
theme_pubclean() +
theme(axis.line = element_line(size = 0.8),
legend.title = element_text(face = "bold", size = 15),
legend.text = element_text(face = "bold", size = 12))
```
```{r ex01-3, echo=FALSE}
require(ggthemes) # ggtheme 패키지 불러오기
require(ggpubr) # ggpubr 패키지 불러오기
iris %>%
ggplot(aes(x = Sepal.Length, y = Petal.Width, color = Species)) +
geom_point(size = 5) +
theme_pubclean() +
theme(axis.line = element_line(size = 0.8),
legend.title = element_text(face = "bold", size = 15),
legend.text = element_text(face = "bold", size = 12))
```
# echo = TRUE
require(ggthemes) # ggtheme 패키지 불러오기
require(ggpubr) # ggpubr 패키지 불러오기
%>%
iris ggplot(aes(x = Sepal.Length, y = Petal.Width, color = Species)) +
geom_point(size = 5) +
theme_pubclean() +
theme(axis.line = element_line(size = 0.8),
legend.title = element_text(face = "bold", size = 15),
legend.text = element_text(face = "bold", size = 12))
Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
ℹ Please use the `linewidth` argument instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
generated.
results
: 코드의 텍스트 출력 결과 포맷 지정markup
(default): 코드 청크 내 스크립트의 출력 형태에 따라 텍스트 출력 결과를 mark-upasis
: 변환하지 않은 원래 R 출력 결과 그대로(as is) 출력hide
: R 스크립트로 생성된 텍스트 출력을 보여주지 않음(warning, message 출력 예외)hold
: 코드 청크로 생성된 모든 소스 및 출력을 단일 블록으로 축소
# results = 'markup'인 경우 아래 텍스트를 mark-up
# (이 경우 아래 텍스트는 ``` ``` 블럭 처리)한 결과를 md 파일로 전송
cat("I'm raw **Markdown** content.\n")
I'm raw **Markdown** content.
# results = 'asis' 인 경우 텍스트를 그대로 md 파일에 입력
cat("I'm raw **Markdown** content.\n")
I’m raw Markdown content.
# results = 'hide'
cat("I'm raw **Markdown** content.\n")
# 텍스트 결과를 출력하지 않음
# results = 'hold'가 아닌 경우 한 라인 별 출력 결과 생성
<- rnorm(10)
x x
[1] 1.1447640 0.4824047 -0.1722872 -1.2966494 1.0578499 0.7634157
[7] -0.5174281 -1.6415275 -0.1469180 -1.1008184
<- rnorm(10, 1, 2)
y y
[1] 1.1721191 2.8038940 -1.3660036 1.2268925 -0.8099688 -3.0260588
[7] -0.1990809 2.8399947 -1.4408382 -2.6852948
+ y x
[1] 2.31688316 3.28629873 -1.53829076 -0.06975689 0.24788106 -2.26264311
[7] -0.71650898 1.19846720 -1.58775620 -3.78611328
# results = 'hold'인 경우 코드 부분과 출력 부분이 따로 블록 처리
<- rnorm(10)
x
x<- rnorm(10, 1, 2)
y
y+ y x
[1] 1.79100946 -0.05027025 -0.06113698 0.37535955 -2.42896312 -0.71182557
[7] -1.40439761 -0.36034527 -0.72258934 -0.48784500
[1] 3.3683699 1.6649934 -1.0719353 2.1082766 1.0766298 2.0000162
[7] 2.6815017 4.0983437 0.5883759 0.3214780
[1] 5.1593794 1.6147232 -1.1330723 2.4836361 -1.3523333 1.2881906
[7] 1.2771041 3.7379984 -0.1342134 -0.1663670
error
: 코드 청크 내 스크립트에 오류에 대한 보존 여부(stop()
)- 기본적으로 Rmarkdown 컴파일 시
error
에 대한 옵션이FALSE
이기 때문에 스크립트(코드)에 오류가 포함되면 컴파일이 정지됨. error = TRUE
이면 오류 메세지를 포함한 텍스트 결과를 출력
- 기본적으로 Rmarkdown 컴파일 시
<- 3
3x <- 25 # 위 행이 구문 오류를 포함하고 있기 때문에
x # 오류 이후의 코드는 실행되지 않음
x
Error: <text>:1:2: 예상하지 못한 기호(symbol)입니다.
1: 3x
^
message
/warning
: 텍스트 출력물 중 경고(warning,warning()
함수의 출력 결과) 메세지 출력 여부 결정
# message = TRUE 인 경우 함수 message 출력
<- function() {
testit message("testing package startup messages")
packageStartupMessage("initializing ...", appendLF = FALSE)
Sys.sleep(1)
packageStartupMessage(" done")
# help(message) 예시 중 발췌
}
testit()
testing package startup messages
initializing ... done
# message=FALSE -> 메세지 출력하지 않음
testit()
# 경고 메세지 출력
<- c(1, 2, "new", 4:10)
x <- as.numeric(x) x
Warning: 강제형변환에 의해 생성된 NA 입니다
코드 서식 관련 청크 옵션
Chunk 옵션 | Default | 설명 |
---|---|---|
comment | TRUE | 소스 코드 실행 출력의 각 줄 앞에 붙는 표시문자 출력 여부: 기본 값은 ‘##’ 임 |
highlight | TRUE | 구문 강조 여부 |
prompt | FALSE | R 프롬프트 출력 여부 |
tidy | FALSE | R 소스 코드 출력 정리 여부 |
comment
: 텍스트 출력물에 주석 표시(default)를 함으로써 소스 코드와 출력 결과를 동시 선택과 복사를 가능(##는 주석 표시이기 때문에 실행되지 않음)- 주석 표시를 제거하고 싶다면
comment = NA
또는comment = ''
- 주석 표시를 제거하고 싶다면
# 디폴트 comment 사용
summary(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
## Median :5.800 Median :3.000 Median :4.350 Median :1.300
## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
highlight
: 구문 강조 표시 여부highlight=FALSE
일 때 소스 코드 출력 결과
# highlight=FALSE
iris %>%
ggplot(aes(x = Sepal.Length, y = Petal.Width, color = Species)) +
geom_point(size = 5) +
theme_pubclean() +
theme(axis.line = element_line(size = 0.8),
legend.title = element_text(face = "bold", size = 15),
legend.text = element_text(face = "bold", size = 12))
prompt
: R 콘솔 상 프롬프트>
,+
출력 여부
> # prompt = TRUE 인 경우 코드 출력 결과
> require(ggthemes) # ggtheme 패키지 불러오기
> require(ggpubr) # ggpubr 패키지 불러오기
> iris %>%
+ ggplot(aes(x = Sepal.Length, y = Petal.Width, color = Species)) +
+ geom_point(size = 5) +
+ theme_pubclean() +
+ theme(axis.line = element_line(size = 0.8),
+ legend.title = element_text(face = "bold", size = 15),
+ legend.text = element_text(face = "bold", size = 12))
tidy
: 코드를 사용자가 지정(혹은formatR::tidy_sorce()
함수에 초기값으로 지정된 코드 정리 값)한 줄 당 문자 길이 등을 반영해 코드를 정리tidy=TRUE
인 경우 자동으로 줄 바꿈
> # tidy = FALSE 인 경우 코드 출력 결과
> require(ggthemes) # ggtheme 패키지 불러오기
> require(ggpubr) # ggpubr 패키지 불러오기
> iris %>% ggplot(aes(x = Sepal.Length, y = Petal.Width, color = Species)) + geom_point(size = 5) + theme_pubclean() + theme(axis.line = element_line(size = 0.8), legend.title = element_text(face = "bold", size = 15), legend.text = element_text(face = "bold", size = 12))
> # tidy = TRUE 인 경우 코드 출력 결과
> require(ggthemes) # ggtheme 패키지 불러오기
> require(ggpubr) # ggpubr 패키지 불러오기
> iris %>%
+ ggplot(aes(x = Sepal.Length, y = Petal.Width, color = Species)) + geom_point(size = 5) +
+ theme_pubclean() + theme(axis.line = element_line(size = 0.8), legend.title = element_text(face = "bold",
+ size = 15), legend.text = element_text(face = "bold", size = 12))
그림(plot) 출력 관련 청크 옵션
Chunk 옵션 | Default | 설명 |
---|---|---|
fig.align | default | 최종 문서에 plot 정렬 방식 결정(center/left/right) |
fig.height/fig.width | 7 | 그림 크기(단위: 인치) |
fig.cap | NULL | 그림 캡션(문자열 입력) |
dpi | 72 | dot per inche: 출력 그림 해상도 |
알아두면 좋은 청크 형태
Setup 청크
- 일반적으로 Rmarkdown 문서는 YAML 해더 뒤에 전역적 청크 옵션 지정과 R 패키지를 불러오는 것으로 시작
- 청크 옵션은
knitr::opts_chunk$set(청크 옵션 지정)
형태로 지정 가능 - 다음은 RStudio 에서 Rmd 문서 생성 시 맨 처음 나오는 코드 청크 예시임
```{r ex01-2, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
- 일반적 활용 예시
```{r option-init, include=FALSE}
knitr::opts_chunk$set(root.dir = '../..', # 프로젝트 폴더 지정
eval = TRUE,
echo = FALSE,
cache = FALSE,
include = TRUE,
tidy = TRUE,
tidy.opts = list(blank=FALSE, width.cutoff=120), # 소스 출력길이 지정
message = FALSE,
warning = FALSE,
engine = "R", # Chunks will always have R code, unless noted
error = TRUE,
fig.path="Figures/", # Set the figure options
fig.align = "center",
fig.width = 7,
fig.height = 7,
fig.keep='all', fig.retina=2)
```
이미지 불러오기
```{r, fig.cap = "Taj Mahal"}
knitr::include_graphics("figures/taj.JPG", dpi = NA)
```
```{r, fig.cap = "Scatterplot of the car dataset"}
cars %>%
ggplot(aes(x = speed, y = dist)) +
geom_point(size = 5) +
theme_tufte(base_size = 15) # ggtheme::theme_tufte()
```
R 생성 도표 포함
테이블 삽입
- 가장 간단한 테이블은
knitr::kable()
함수를 통해 생성 가능 kable()
함수는 가장 단순한 형태의 표만 생성하기 때문에 복잡한 표를 만들기에는 한계가 존재함- 이를 보완하기 위해 다음과 같은 패키지 활용
kableExtra
: HTML 또는 LaTeX 용 표 생성flextable
+officer
: HTML, 워드 문서 표 작성
```{r}
knitr::kable(head(iris))
```
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
---|---|---|---|---|
5.1 | 3.5 | 1.4 | 0.2 | setosa |
4.9 | 3.0 | 1.4 | 0.2 | setosa |
4.7 | 3.2 | 1.3 | 0.2 | setosa |
4.6 | 3.1 | 1.5 | 0.2 | setosa |
5.0 | 3.6 | 1.4 | 0.2 | setosa |
5.4 | 3.9 | 1.7 | 0.4 | setosa |