-
Notifications
You must be signed in to change notification settings - Fork 7
/
model-cloudera-plumber.Rmd
150 lines (114 loc) · 4.17 KB
/
model-cloudera-plumber.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
---
layout: page
title: xwMOOC 모형
subtitle: "고객이탈 - RESTful API 기본기 `plumber`"
author:
name: xwMOOC
url: https://www.facebook.com/groups/tidyverse/
affiliation: Tidyverse Korea
date: "`r Sys.Date()`"
output:
html_document:
toc: yes
toc_float: true
highlight: tango
code_folding: show
number_section: true
self_contained: true
editor_options:
chunk_output_type: console
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, message=FALSE, warning=FALSE,
comment="", digits = 3, tidy = FALSE, prompt = FALSE, fig.align = 'center')
```
# `plumber` 헬로 월드 {#plumber-helloworld}
[`plumber` - An R package that converts your existing R code to a web API using a handful of special one-line comments.](https://www.rplumber.io/)에 나와 있는 `plumber` 예제를 바탕으로 RESTful API를 헬로월드를 작성한다.
<div class = "row">
<div class = "col-md-3">
**`plumber` 실행파일**
`main()` 함수처럼 개발된 RESTful API를 실행시키는 파일.
```{r plumber-run, eval=FALSE}
library(plumber)
r <- plumb("deploy/plumber.R")
r$run(port=8000)
```
</div>
<div class = "col-md-9">
**RESTful API 서비스 파일**
`/echo`, `/plot`, `/sum`, `sum_two` 총 4가지 API 서비스를 GET, POST 방식으로 제공하고 있다.
```{r plumber-RESTful-api, eval=FALSE}
library(tidyverse)
#* Echo back the input
#* @param msg The message to echo
#* @get /echo
function(msg=""){
list(msg = paste0("The message is: '", msg, "'"))
}
#* Plot a histogram with ggplot
#* @png
#* @get /ggplot
function() {
p <- data.frame(x = rnorm(100)) %>%
ggplot(aes(x)) +
geom_density(fill = "tomato", alpha = 0.5)
print(p)
}
#* Plot a histogram with Base plot
#* @png
#* @get /plot
function(){
rand <- rnorm(100)
hist(rand)
}
#* Return the sum of two numbers
#* @param a The first number to add
#* @param b The second number to add
#* @post /sum
function(a=1, b=2){
as.numeric(a) + as.numeric(b)
}
#* Return the sum of two numbers
#* @param a The first number to add
#* @param b The second number to add
#* @get /sum_two
function(a, b){
as.numeric(a) + as.numeric(b)
}
```
</div>
</div>
## `/echo` 메시지 서비스 {#plumber-echo}
가장 먼저 웹브라우저 주소창에 `http://localhost:8000/echo?msg="Hello_World"`을 입력시켰을 때 `msg` 매개변수로 "Hello_World"를 전달했을 때 이를 메아리치는 경우를 구현해보자.
```{r run-helloworld-echo}
library(httr)
library(tidyverse)
GET('http://localhost:8000/echo?msg="Hello_World"') %>%
content()
```
## `/plot` 그래프 {#plumber-plot}
`/plot` 시각화를 위해서 몇가지 조작을 해야는데 먼저 `/ggplot`으로 서비스를 준비한다.
Rmarkdown 이미지를 넣기 위해서 `plot(0:1, 0:1, type = "n")` 사전 설정을 하고, `rasterImage(0, 0, 1, 1)`를 통해 숫자로 나온 결과를 시각화 시킨다.
```{r run-helloworld-ggplot}
library(httr)
library(tidyverse)
plot(0:1, 0:1, type = "n")
GET('http://localhost:8000/ggplot') %>%
content() %>% rasterImage(0, 0, 1, 1)
```
`/plot` 서비스는 Base 그래픽으로 결과를 출력하는 사례다.
```{r run-helloworld-plot}
plot(0:1, 0:1, type = "n")
GET('http://localhost:8000/plot') %>%
content() %>% rasterImage(0, 0, 1, 1)
```
## `/sum_two` 그래프 {#plumber-sum}
`/sum_two` 서비스는 두개의 값을 받아 더하기 하는 단순한 함수로 입력값을 받아 적절히 처리하는 사례를 모사한다.
```{r run-helloworld-function}
GET('http://localhost:8000/sum_two?a=7&b=10') %>%
content()
```
# R마크다운 문서 제작 {#plumber-helloworld-document}
RESTful API를 R마크다운 문서화를 위해서 먼저 제작된 RESTful API를 띄워놓고 이를 R마크다운 문서에서 불러다 호출하는 방식으로 HTML 문서를 제작한다.
이 과정에서 RESTful API 호출결과를 가져올 경우 이를 파싱해서 적절한 형태로 전환시켜야 하는데 이를 위해서 `httr` 팩키지 `content()` 함수와 시각화 객체를 객체를 PNG 파일로 삽입시키는데 `rasterImage()` 함수를 사용한다.
![`plumber`와 R마크다운](fig/plumber-rmarkdown.png){#id .class width="100%"}