# ------------------
# 본 장은 R에서 Keras를 실습하는 과정입니다.  
# 딥러닝에 대한 자세한 이론 설명은 별도로 하지 않습니다. 
# 추후 딥러닝 강좌 개설 시, 중요 개념들에 대해 짚고 넘어갑니다. 
# ------------------


1단계: 패키지 설치

R에서 패키지 설치 진행은 아래와 같이 진행하시면 됩니다. 

파이썬이 없는 경우 자동으로 설치를 도와주기 때문에 큰 걱정은 안하셔도 됩니다. 

 

# 패키지는 H2O와 다르게 쉽습니다. 
devtools::install_github("rstudio/keras")
library(keras)

R의 다른 패키지와 달리, keras는 실행함수가 하나 더 있습니다. 

# 텐서플로우 설치: tensorflow를 벡엔드로 사용하기 때문. 
install_keras()

Collecting package metadata (current_repodata.json): ...working... done
Solving environment: ...working... done

# All requested packages already installed.



==> WARNING: A newer version of conda exists. <==
  current version: 4.7.12
  latest version: 4.8.2

Please update conda by running

    $ conda update -n base -c defaults conda


Requirement already up-to-date: tensorflow==2.0.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (2.0.0)
Requirement already up-to-date: keras in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (2.3.1)
Requirement already up-to-date: tensorflow-hub in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (0.7.0)
Requirement already up-to-date: h5py in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (2.10.0)
Requirement already up-to-date: pyyaml in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (5.3)
Requirement already up-to-date: requests in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (2.23.0)
Requirement already up-to-date: Pillow in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (7.0.0)
Requirement already up-to-date: scipy in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (1.4.1)
Requirement already satisfied, skipping upgrade: wheel>=0.26 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (0.34.2)
Requirement already satisfied, skipping upgrade: gast==0.2.2 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (0.2.2)
Requirement already satisfied, skipping upgrade: keras-preprocessing>=1.0.5 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.1.0)
Requirement already satisfied, skipping upgrade: opt-einsum>=2.3.2 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (3.2.0)
Requirement already satisfied, skipping upgrade: termcolor>=1.1.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.1.0)
Requirement already satisfied, skipping upgrade: google-pasta>=0.1.6 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (0.1.8)
Requirement already satisfied, skipping upgrade: tensorboard<2.1.0,>=2.0.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (2.0.2)
Requirement already satisfied, skipping upgrade: tensorflow-estimator<2.1.0,>=2.0.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (2.0.1)
Requirement already satisfied, skipping upgrade: wrapt>=1.11.1 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.12.1)
Requirement already satisfied, skipping upgrade: grpcio>=1.8.6 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.27.2)
Requirement already satisfied, skipping upgrade: keras-applications>=1.0.8 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.0.8)
Requirement already satisfied, skipping upgrade: numpy<2.0,>=1.16.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.18.1)
Requirement already satisfied, skipping upgrade: six>=1.10.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.14.0)
Requirement already satisfied, skipping upgrade: astor>=0.6.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (0.8.1)
Requirement already satisfied, skipping upgrade: absl-py>=0.7.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (0.9.0)
Requirement already satisfied, skipping upgrade: protobuf>=3.6.1 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (3.11.3)
Requirement already satisfied, skipping upgrade: chardet<4,>=3.0.2 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from requests) (3.0.4)
Requirement already satisfied, skipping upgrade: idna<3,>=2.5 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from requests) (2.9)
Requirement already satisfied, skipping upgrade: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from requests) (1.25.8)
Requirement already satisfied, skipping upgrade: certifi>=2017.4.17 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from requests) (2019.11.28)
Requirement already satisfied, skipping upgrade: setuptools>=41.0.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (45.2.0.post20200210)
Requirement already satisfied, skipping upgrade: markdown>=2.6.8 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (3.2.1)
Requirement already satisfied, skipping upgrade: werkzeug>=0.11.15 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (1.0.0)
Requirement already satisfied, skipping upgrade: google-auth-oauthlib<0.5,>=0.4.1 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.4.1)
Requirement already satisfied, skipping upgrade: google-auth<2,>=1.6.3 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (1.11.2)
Requirement already satisfied, skipping upgrade: requests-oauthlib>=0.7.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (1.3.0)
Requirement already satisfied, skipping upgrade: rsa<4.1,>=3.1.4 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (4.0)
Requirement already satisfied, skipping upgrade: pyasn1-modules>=0.2.1 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.2.8)
Requirement already satisfied, skipping upgrade: cachetools<5.0,>=2.0.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (4.0.0)
Requirement already satisfied, skipping upgrade: oauthlib>=3.0.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (3.1.0)
Requirement already satisfied, skipping upgrade: pyasn1>=0.1.3 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from rsa<4.1,>=3.1.4->google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.4.8)

Installation complete.

위와 같은 표시가 나오면 R에서도 keras를 사용할 수 있습니다. 


2단계: 데이터 불러오기

간단하게 iris 데이터를 활용하도록 합니다. iris 데이터를 활용하는 이유는, R은 데이터프레임에 최적화된 언어이고, 대부분의 사용자가 데이터프레임에 익숙합니다. 따라서, 데이터프레임 데이터를 어떻게 적용하는 것이 궁금하실 것 같아서 일부러 쉬운 데이터를 적용했습니다. 

 

R에서도 당연히 이미지 분류 등이 가능합니다. 

#### 2단계: 데이터 불러오기 ####
iris <- iris

3단계: 간단하게 상관관계 그래프 그리기

사실 여기는 굳이 하지 않으셔도 됩니다. 다만, 분석가는 늘 데이터를 시각화해서 데이터의 관계 등을 확인하는 EDA(탐색적 자료 분석)을 꼭 진행하는 걸 권장합니다. 

#### 3단계: 상관관계 그래프 작성하기 (옵션) #### 
library(corrplot)

# 수치형 데이터를 상관관계수로 변환하기
M <- cor(iris[,1:4])

# 상관관계 그래프 작성하기
corrplot(M, method="circle")

 

이렇게 나오면 됩니다. 


4단계: 데이터 전처리 및 가공

 

여기가 핵심입니다. 분류 모형이지만, 딥러닝은 행렬로 연산하기 때문에, 매트릭스 형태로 변환해야 합니다. 또한 데이터 정규화도 같이 진행합니다. 본 장에서는 왜 이러한 작업을 하는지는 구체적으로 설명하지 않습니다. 

 

추후 딥러닝 이론은 요약해서 올릴 예정입니다. 

# (1) 데이터프레임을 행렬로 변환 -------------------
# 범주형을 숫자로 바꿔야 한다. 
# 딥러닝은 데이터프레임이 아니라 행렬형태로 데이터를 받는다. 
iris[,5] <- as.numeric(as.factor(unlist(iris[,5]))) -1
iris <- as.matrix(iris)
dimnames(iris) <- NULL

# (2) 데이터 정규화 -------------------
# keras 패키지에는 normalize 함수가 있다. 
iris_x <- normalize(iris[,1:4])

# 정규화가 진행된 데이터를 다시 5 column과 합친 코드이다. 
iris_mat <- cbind(iris_x, iris[,5])
head(iris_mat)

# 아래는 결과 값입니다. 
          [,1]      [,2]      [,3]       [,4] [,5]
[1,] 0.8037728 0.5516088 0.2206435 0.03152050    0
[2,] 0.8281329 0.5070201 0.2366094 0.03380134    0
[3,] 0.8053331 0.5483119 0.2227517 0.03426949    0
[4,] 0.8000302 0.5391508 0.2608794 0.03478392    0
[5,] 0.7909650 0.5694948 0.2214702 0.03163860    0
[6,] 0.7841750 0.5663486 0.2468699 0.05808704    0

5단계: 딥러닝 모형 데이터셋 분리

# 데이터 셋 나누기 index 
ind <- sample(2, nrow(iris_mat), replace=TRUE, prob=c(0.67, 0.33))

# 모형 설계행렬
iris.training <- iris_mat[ind==1, 1:4]
iris.test <- iris_mat[ind==2, 1:4]

# 모형 예측변수
iris.trainingtarget <- iris_mat[ind==1, 5]
iris.testtarget <- iris_mat[ind==2, 5]

# One-Hot 인코딩: 훈련예측변수
iris.trainLabels <- to_categorical(iris.trainingtarget)

# One-Hot 인코딩: 검증예측변수
iris.testLabels <- to_categorical(iris.testtarget)

6단계: 딥러닝 모형 개발

데이터에 적합한 딥러닝 모형을 적용해야 하는데 신경망 계층(layer)은 몇층으로 할지, 노드는 몇개로 할지, 활성화(activation) 함수는 무엇으로 할지, 하이퍼 모수 학습률(learning rate)은 어떻게 정할지, 이렇게 다양한 조합이 모형의 성능에 영향을 미치게 된다. 그런 점에서 케라스는 모형자체에 개발자가 집중할 수 있도록 함으로써 큰 도움을 주고 있다.

 

일단 잘 모르겠다. 

 

그냥 한번 만들어 보자. 

set.seed(777)
# (1) 모형 초기화
model <- keras_model_sequential()

# 여기에 우선적으로 아래와 같이 신경망 계층을 만듭니다. 
# output 값이 3개입니다. (versicolor, virginica, setosa)
# 8 hidden notes를 만들었고, input shape = 4개로 만들었는데, 
# 이유는 4개의 column이 존재하기 때문입니다. 

model %>% 
  layer_dense(units = 8, activation = 'relu', input_shape = c(4)) %>% 
  layer_dense(units = 3, activation = 'softmax')
2020-03-12 22:46:36.235402: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-03-12 22:46:36.297796: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fa12eb3fe50 executing computations on platform Host. Devices:
2020-03-12 22:46:36.297819: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): Host, Default Version

# 모형 요약
summary(model)
Model: "sequential"
_______________________________________________________________________________
Layer (type)                       Output Shape                    Param #     
===============================================================================
dense (Dense)                      (None, 8)                       40          
_______________________________________________________________________________
dense_1 (Dense)                    (None, 3)                       27          
===============================================================================
Total params: 67
Trainable params: 67
Non-trainable params: 0
_______________________________________________________________________________

# 모형 configuration
get_config(model)
{'name': 'sequential', 'layers': ...} # 직접 콘솔에서 확인 바랍니다. 

#  layer configuration
get_layer(model, index = 1)
<tensorflow.python.keras.layers.core.Dense>

# List the model's layers
model$layers
[[1]]
<tensorflow.python.keras.layers.core.Dense>

[[2]]
<tensorflow.python.keras.layers.core.Dense>

# List the input tensors
model$inputs
[[1]]
Tensor("dense_input:0", shape=(None, 4), dtype=float32)

# List the output tensors
model$outputs
[[1]]
Tensor("dense_1/Identity:0", shape=(None, 3), dtype=float32)
  • output 값이 3개입니다. (versicolor, virginica, setosa)
  • 8 hidden notes를 만들었고, input shape = 4개로 만들었는데,
  • 이유는 4개의 column이 존재하기 때문입니다. 

7단계: 딥러닝 모형 컴파일

  • categorical_crossentropy는 다중 분류를 의미합니다. 
  • 만약 이중분류를 하고 싶다면, 'binary_crossentropy' 입력하면 됩니다.
  • 가장 많이 사용되는 최적화 알고리즘은 SGD (Stochastic Gradient Descent), ADAM 및 RMSprop입니다. 
model %>% compile(
  loss = 'categorical_crossentropy',
  optimizer = 'adam',
  metrics = 'accuracy'
)

8단계: 딥러닝 모형 적합

드디어 우리가 하려고 하는 것이 나왔습니다. 시간이 조금 걸립니다. 멋진 그래프가 움직이는 것을 보는 경험을 할 것입니다. 저는 처음에 조금 신기했습니다. 

model %>% fit(
  iris.training, 
  iris.trainLabels, 
  epochs = 500, 
  batch_size = 5,
  validation_split = 0.1
)

궁금하신 분만 보세요, 약 3분 45초 러닝타임 나옵니다. iris 데이터만 해도 3분 45초이니.. 다른 큰 데이터는 로컬 환경에서는 못할 듯 싶습니다. (참고로 맥북 에어로 작업중입니다!) 


9단계: 예측 모형 테스트

# 테스트 데이터를 활용한 예측값 산출
classes <- model %>% predict_classes(iris.test, batch_size = 128)

# 혼동행렬
table(iris.testtarget, classes)

# 결과표
               classes
iris.testtarget  0  1  2
              0 19  0  0
              1  0 13  2
              2  0  1 13

10단계: 모형 평가

# 테스트 데이터를 기반으로 모형을 평가한다. 
score <- model %>% evaluate(iris.test, iris.testLabels, batch_size = 128)

# loss 및 accuracy가 산출 된 것을 확인할 수 있다. 
print(score)

$loss
[1] 0.1443771

$accuracy
[1] 0.9375

 

자세한 내용은 keras 홈페이지에 참고하세요. https://keras.io/

 

Home - Keras Documentation

Keras: The Python Deep Learning library You have just found Keras. Keras is a high-level neural networks API, written in Python and capable of running on top of TensorFlow, CNTK, or Theano. It was developed with a focus on enabling fast experimentation. Be

keras.io


여기서부터 광고합니다. 

 

- 강사가 필요한 곳은 언제든지 연락 주세요. (2020년 6월부터 가능)

- 온라인 강의 제작도 가능합니다.

- Kaggle 데이터 시각화 위주로 공동으로 책 쓰실 분 찾습니다.

- 안타깝지만 개인 과외는 하지 않습니다!

 

연락처: j2hoon85@gmail.com

 

--- 커리큘럼은 아래와 같습니다. ---

* 소스코드 및 강의안 (PPT) 모두 준비 완료

1일차: 데이터 전처리와 시각화

- R & RStudio 설치 및 CRAN 생태계 설명

- 데이터 전처리: dplyr 활용

- 데이터 시각화: ggplot2 패키지 & 그외 동적 시각화 패키지

*웹크롤링, 몽고DB 연동, shiny 대시보드 연동 커리큘럼도 제작중입니다. 

 

2일차: 기초통계 및 회귀분석 ML모형

- 통계분석: 기술통계분석, 교차분석, 집단간 차이분석, 회귀분석 및 보고서 작성 요령

- 회귀모형개발: 선형회귀, 다중회귀, caret 패키지 활용

*통계분석은 지속적으로 업데이트 될 예정입니다.

 

3일차: 분류모형 및 h2o 패키지 소개

- 이상치 및 결측치 처리

- 이항 및 다항분류

- caret 패키지 & h2o 패키지 활용 모형 개발

 

4일차: 모형성능 향상 및 딥러닝 예제

- 통계적 preProcessing 절차 소개

- Parameter Tuning 절차 및 Sample 소개

- 딥러닝 소개 및 keras and tensorflow 2.0 Sample 튜토리얼

* shiny에서 머신러닝 모형 deploy 하는법도 올 상반기 중으로 준비중입니다 (GCP 서버 활용)

 

This post is about "R interface for Apache Spark" using R package. For newbie like me, settings, installation, prerequisite, etc.. interfacing, connectings between components are always hard, most of cases, it takes lots of time. 

Wanna share kindly with others the important notes when settings are ongoing. 

Okay, Let's begin. 

 

My Session Info() is below

> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS  10.15.1

1. List of Downloads

Please read below carefully before downloading resources. 

> Note: Spark runs on Java 8, Python 2.7+/3.4+ and R 3.1+. For the Scala API, Spark 2.4.4 uses Scala 2.12. You will need to use a compatible Scala version (2.12.x) (Dec 2019).

Personally, I was in trouble with settings because of Java versions. The version of Java was Java 11. and it was difficult to use. If you don't have Java 8, then please download Java 8. (Spark Documentation)

 

Overview - Spark 2.4.4 Documentation

Spark Overview Apache Spark is a fast and general-purpose cluster computing system. It provides high-level APIs in Java, Scala, Python and R, and an optimized engine that supports general execution graphs. It also supports a rich set of higher-level tools

spark.apache.org

The other way to download them is via brew command. 

$ brew install blah~

But, In this post, the way will not be included. Okay, lists of downloads are followed.

 

 

Java SE Development Kit 8 - Downloads

Java SE Development Kit 8 Downloads Thank you for downloading this release of the Java™ Platform, Standard Edition Development Kit (JDK™). The JDK is a development environment for building applications, applets, and components using the Java programming la

www.oracle.com

 

sparklyr

2018-10-02 — Announcement We are excited to share that sparklyr 0.9 is now available on CRAN! Spark Stream integration, Job Monitoring and support for Kubernetes Read More… 2018-04-09 — Announcement We are very excited to announce that the graphframes pack

spark.rstudio.com

You can install the sparklyr package from CRAN

install.packages("sparklyr")

Setting version is important, you may check which version is available with spark_available_versions(). 

library(sparklyr)
spark_available_versions()

The, You are able to install a local version of Spark for development purposes:

> spark_install(version = "2.4.0")
Installing Spark 2.4.0 for Hadoop 2.7 or later.
Downloading from:
- 'https://archive.apache.org/dist/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz'
Installing to:
- '~/spark/spark-2.4.0-bin-hadoop2.7'
trying URL 'https://archive.apache.org/dist/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz'
Content type 'application/x-gzip' length 227893062 bytes (217.3 MB)

When running spark_install(), the spark installation folders are downloaded at directory ~/spark/spark-2.4.0-bin-hadoop2.7
Then, you get all resources in order to connect between spark and R.


2. Preparations

2.1. Home folder

  • The main home folder is /Users/your_account_name

  • If you don't know your home folder, then please type cd $HOME and run it. 

  • My case is /Users/evan/

 

2.2. The installation folder

  • Java, Python are sets automatically when installing it. You don't need to touch them. 

  • However, Sbt, Scala, and Spark will be installed at /Users/evan/server

  • How to make server folder on terminal? It's easy. 

~ evan$ mkdir server
~ evan$ cd server

Note for beginners, the command cd changes your working directory (from wherever it is) to HOME directory.

 

2.3 Move all downloaded files to $HOME/server folder

Once you copy all files, please double check the necessary files like below. scalar, sbt, spark


3. Set up Shell Environment editing bash_profile file

Here are the directory paths of the programs that we have installed so far:

  • JDK: /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk

  • Python: /Library/Frameworks/Python.framework/Versions/3.7

  • Sbt: /Users/evan/server/sbt

  • Scala: /Users/evan/server/scala-2.13.1

  • Spark: /Users/evan/server/spark-2.4.0-bin-hadoop2.7

To check one more if every folder is at the directory where it should be, always use the command cd. For instance try to put command $ cd /Users/evan/server/sbt. If directory is changed, then it's correct. if not, then some files are not saved correctly. 

 

3.1. Set up .bash_profile file

  • For beginners, this file starts with a “dot”. Therefore, make sure that you type the file name correctly, which is .bash_profile (with a “dot” in front).

  • Open the .bash_profile file, which is located at your HOME directory (i.e., ~/.bash_profile), using any text editor (e.g., TextEdit, nano, vi, or emacs). For example, my favorite editor is emacs. So, it could be following. 

3.2. Edit .bash_profile file

 

Copy these lines to the file.

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/
export SPARK_HOME=/Users/evan/server/spark-2.4.0-bin-hadoop2.7
export SBT_HOME=/Users/evan/server/sbt
export SCALA_HOME=/Users/evan/server/scala-2.13.1
export PATH=$JAVA_HOME/bin:$SBT_HOME/bin:$SBT_HOME/lib:$SCALA_HOME/bin:$SCALA_HOME/lib:$PATH
export PATH=$JAVA_HOME/bin:$SPARK_HOME:$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
export PYSPARK_PYTHON=python3

When copyting to .bash_profile, DO NOT DELETE OTHER LINES. After copying all to .bash_profile, then save and close file.

 

3.3. Apply update .bash_profile file

Since the .bash_profile has been changed, we have to reload it. Options are

  • back to terminal, and type 
source ~/.bash_profile
  • Quit and reopen the Terminal program. Make sure you completely quit the Terminal using menu → Quit Terminal (⌘Q), otherwise the environment variables declared above will not be loaded. 


4. Connecting to Spark

You can connect to both local instances of Spark as well as remote Spark clusters. Here we’ll connect to a local instance of Spark via the spark_connect function:

> library(sparklyr)
> sc <- spark_connect(master = "local", spark_home = "your_spark_home_dir/spark-2.4.0-bin-hadoop2.7/")
* Using Spark: 2.4.0

Welcome to Spark. The details are sparklyr: R interface for Apache Spark

 

sparklyr

2018-10-02 — Announcement We are excited to share that sparklyr 0.9 is now available on CRAN! Spark Stream integration, Job Monitoring and support for Kubernetes Read More… 2018-04-09 — Announcement We are very excited to announce that the graphframes pack

spark.rstudio.com


5. Examples

All sample codes are written at the offical documentations.

5.1. Using dplyr

We are able to use all of the available dplyr functions within the spark cluster. 

We’ll start by copying some datasets from R into the Spark cluster (note that you may need to install the nycflights13 and Lahman packages in order to execute this code):

> library(dplyr)
> library(nycflights13)
> library(Lahman)

> iris_tbl <- copy_to(sc, iris)
> flights_tbl <- copy_to(sc, nycflights13::flights, "flights")
> batting_tbl <- copy_to(sc, Lahman::Batting, "batting")
> src_tbls(sc)
[1] "batting" "flights" "iris"

 

When copyting to spark, you may see these dataset at spark UI. Open web browser, type http://localhost:4040/storage/. Then you may see pic below. 

 

Let's use filter() in dplyr package

# filter by departure delay and print the first few records
> flights_tbl %>% filter(dep_delay == 2)
# Source: spark<?> [?? x 19]
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
 1  2013     1     1      517            515         2      830            819
 2  2013     1     1      542            540         2      923            850
 3  2013     1     1      702            700         2     1058           1014
 4  2013     1     1      715            713         2      911            850
 5  2013     1     1      752            750         2     1025           1029
 6  2013     1     1      917            915         2     1206           1211
 7  2013     1     1      932            930         2     1219           1225
 8  2013     1     1     1028           1026         2     1350           1339
 9  2013     1     1     1042           1040         2     1325           1326
10  2013     1     1     1231           1229         2     1523           1529
# … with more rows, and 11 more variables: arr_delay <dbl>, carrier <chr>,
#   flight <int>, tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
#   distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Here, you may read # Source: spark<?> [?? x 19]. This points that dplyr function uses datasets from spark-cluster stored. 

 

5.2. Using SQL

It's possible to execute SQL queries directly against tables if you are more familar with SQL. The spark_connection object implements a DBI interface for Spark, so you can use dbGetQuery to execute SQL and return the result as an R data frame:

> library(DBI)
> iris_preview <- dbGetQuery(sc, "SELECT * FROM iris LIMIT 10")
> iris_preview
   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
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa

 

5.3. Machine Learning

You can orchestrate machine learning algorithms in a Spark cluster via the machine learning functions within sparklyr. These functions connect to a set of high-level APIs built on top of DataFrames that help you create and tune machine learning workflows.

Here’s an example where we use ml_linear_regression to fit a linear regression model. We’ll use the built-in mtcars dataset, and see if we can predict a car’s fuel consumption (mpg) based on its weight (wt), and the number of cylinders the engine contains (cyl). We’ll assume in each case that the relationship between mpg and each of our features is linear.

# copy mtcars into spark
> mtcars_tbl <- copy_to(sc, mtcars)

# transform our data set, and then partition into 'training', 'test'
> partitions <- mtcars_tbl %>%
+  filter(hp >= 100) %>%
+  mutate(cyl8 = cyl == 8) %>%
+  sdf_random_split(training = 0.5, test = 0.5, seed = 1099)

# fit a linear model to the training dataset
> fit <- partitions$training %>%
+  ml_linear_regression(response = "mpg", features = c("wt", "cyl"))
> fit
Formula: mpg ~ wt + cyl

Coefficients:
(Intercept)          wt         cyl 
  33.499452   -2.818463   -0.923187 
> summary(fit)
Deviance Residuals:
   Min     1Q Median     3Q    Max 
-1.752 -1.134 -0.499  1.296  2.282 

Coefficients:
(Intercept)          wt         cyl 
  33.499452   -2.818463   -0.923187 

R-Squared: 0.8274
Root Mean Squared Error: 1.422

Spark machine learning supports a wide array of algorithms and feature transformations and as illustrated above it’s easy to chain these functions together with dplyr pipelines.


6. Conclusion

Dealing with this tutorial for a couple of days. The hard thing to me was to satisfy system requirements. Environment settings are not always comfortable with me who has studied Liberal Arts - Philiosophy, Religious Studies, Development Studies. All area is trying to collect data and store somewhere else, and get data from Database or Clusters, and finally analyse them. Although settings up data pipeline is a bit far away from analyzing data, still it's valuable for them to deal with part of data engineering area. 

 

Hope to enjoy and happy to code. 


References: https://medium.com/luckspark/installing-spark-2-3-0-on-macos-high-sierra-276a127b8b85

 

Installing Apache Spark 2.3.0 on macOS High Sierra

Apache Spark 2.3.0 has been released on Feb 28, 2018. This tutorial guides you through essential installation steps on macOS High Sierra.

medium.com

 

'R > [R] DB Connection' 카테고리의 다른 글

[R] DB Connection with MySQL  (0) 2018.12.11

시각화의 옵션 Facets

면분할이라고도 한다. Facets을 활용하면 다양한 그래프를 한 화면에 담을 수 있는 장점이 있다.

facets() 함수와 관련해서 크게 4가지 기준으로 작성한다.

  • facets 기본예제
  • Customizing Layout
  • Re-Arrange
  • 라벨링
  • Y축 스케일 적용
  • facets()를 활용한 그룹화

데이터셋

이번 데이터는 GDP관련 데이터를 활용하려고 한다. gapminder 데이터셋을 활용하려고 한다.

# install.packages("gapminder")
library(gapminder)
dplyr::glimpse(gapminder)
## Observations: 1,704
## Variables: 6
## $ country   <fct> Afghanistan, Afghanistan, Afghanistan, Afghanistan, Af…
## $ continent <fct> Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, …
## $ year      <int> 1952, 1957, 1962, 1967, 1972, 1977, 1982, 1987, 1992, …
## $ lifeExp   <dbl> 28.801, 30.332, 31.997, 34.020, 36.088, 38.438, 39.854…
## $ pop       <int> 8425333, 9240934, 10267083, 11537966, 13079460, 148803…
## $ gdpPercap <dbl> 779.4453, 820.8530, 853.1007, 836.1971, 739.9811, 786.…

gapminder 데이터는 스웨덴의 비영리 통계분석 서비스의 일종이며, 유엔의 데이터를 바탕으로 한 인구 예측, 부의 이동 등과 같은 연구논문을 게재하고 있다. RStudio 회사에서 직접 데이터셋을 정리하여 업데이트를 하고 있다.

각 변수에 대한 자세한 설명은 RStudio Editor에서 ?gapminder를 실행해보자.

사전 준비작업

  • 연도는 2007년도 기준으로 구분하려고 한다. dplyr 패키지 안에 포함된 filter() 함수를 활용했다.
  • select() 함수를 활용 하여 각 대륙별 대표국가만 추출하여 그래프를 작성하도록 한다.
    • Australia
    • Brazil
    • Korea, Rep.
    • Nigeria
    • Germany
    • United States
library(dplyr)

gapminder2 <- gapminder %>% 
  filter(year == 2007, country %in% c("Australia", "Brazil", "Korea, Rep.", "Nigeria", "Germany", "United States"))

기본 그래프

첫번째 막대그래프, X축은 country 활용할 것이고, Y축은 lifeExp를 활용할 것이다.

ggplot(gapminder2, aes(x = country, y = lifeExp)) + 
  geom_bar(stat = 'identity', fill = 'forest green')

두번째 막대그래프, X축은 country 활용할 것이고, Y축은 gdpPercap을 활용할 것이다.

ggplot(gapminder2, aes(x = country, y = gdpPercap)) + 
  geom_bar(stat = 'identity', fill = 'forest green')

여기서 한가지 불편함을 느껴야 한다. X축은 동일한 변수 continent를 사용했지만, Y축은 lifeExp과 pop을 나눠서 그래프를 그렸다. 합칠 수 있는 방법이 없을까?

우선 간단한 Tip을 드리자면 Y축 두개 변수에 담고 있는 데이터를 합칠 필요가 있다.

gather() 함수를 사용해서 가공한다.

gather()

gather() 함수는 tidyr 패키지안에 내장 되어 있는 함수다. tidyr 패키지 사용 예제는 데이터 가공 때 다시 한번 다루도록 한다.

library(dplyr)
library(tidyr)

gapminder3 <- gapminder2 %>% 
  gather(key = "records", value = "value", c("lifeExp", "gdpPercap"))

기존 gapminder 데이터와 다르게 lifeExp와 pop 데이터가 합쳐진 것을 볼 수가 있다. 이 상황에서 facet_wrap() 함수를 적용하여 시각화를 진행하면 아래와 같다.

facets 기본예제

ggplot(gapminder3, aes(x = country, y = value)) + 
  geom_bar(stat = 'identity', fill = 'forest green') + 
  facet_wrap(~records)

위 그래프의 문제점은 무엇일까?

  • X축의 글자가 겹쳐보인다는 점
  • 나라의 알파벳 순서대로 배여 되었다는 점
  • Y축 Value가 다르기 때문에 그래프를 합치면 해석이 난해해진다는 점이다.

이러한 문제를 어떻게 해결하면 좋을지 하나씩 해결해보자.

Customizing Layout

facet_wrap() 함수에 인자값 ncol = 1을 입력해보자.

ggplot(gapminder3, aes(x = country, y = value)) + 
  geom_bar(stat = 'identity', fill = 'forest green') + 
  facet_wrap(~records, ncol = 1)

X축의 나라이름이 겹쳐보인 것은 해결을 하였다.

Re-Arrange

gdpPercap 기준으로 이제 정렬을 해보자. 이 때 factor() 함수를 사용한다.

gapminder2$country <- factor(gapminder2$country, 
                     levels = gapminder2$country[order(gapminder2$gdpPercap)])

gapminder3 <- gapminder2 %>% 
  gather(key = "records", value = "value", c("lifeExp", "gdpPercap"))


ggplot(gapminder3, aes(x = country, y = value)) + 
  geom_bar(stat = 'identity', fill = 'forest green') + 
  facet_wrap(~records, ncol = 1)

변수 gdpPercap & lifeExp 이름이 가독성이 좋지 않아서 Y축으로 옮기고 싶다면, 기존 facet_wrap() 안에 strip.position = "left" 코드를 추가적으로 입력한다. 아래와 같이 코드를 실행해본다.

gapminder2$country <- factor(gapminder2$country, 
                     levels = gapminder2$country[order(gapminder2$gdpPercap)])

gapminder3 <- gapminder2 %>% 
  gather(key = "records", value = "value", c("lifeExp", "gdpPercap"))

ggplot(gapminder3, aes(x = country, y = value)) + 
  geom_bar(stat = 'identity', fill = 'forest green') + 
  facet_wrap(~records, ncol = 1, strip.position = "left")

라벨링

gdpPercap과 lifeExp는 일종의 약어이다. 독자들에게 Full Name을 보여주는 것은 시각화의 기본적인 의무이기도 하다. facet_wrap() 함수안에 labeller=를 활용해본다.

gapminder2$country <- factor(gapminder2$country, 
                     levels = gapminder2$country[order(gapminder2$gdpPercap)])

gapminder3 <- gapminder2 %>% 
  gather(key = "records", value = "value", c("lifeExp", "gdpPercap"))

var_names <- list(
  "lifeExp"   = "Life Expectancy" ,
  "gdpPercap" = "GDP Per Capita"
)

var_labeller <- function(variable,value){
  return(var_names[value])
}

ggplot(gapminder3, aes(x = country, y = value)) + 
  geom_bar(stat = 'identity', fill = 'forest green') + 
  facet_wrap(~records, ncol = 1, strip.position = "left", labeller = var_labeller)

lifeExp가 Life Expectancy로 gdpPercap가 GDP Per Capita로 변경된 것을 확인할 수 있다.

Y축 스케일 적용

여전히 한가지 문제가 풀리지 않고 있다. gdpPercap 변수에 관한 그래프는 잘 나와 있는 반면 Life Expectancy에 관한 그래프는 확인이 되지 않는다. 또 하나 문제점 중의 하나는 Y축 Scale이 gdpPercap 기준으로 맞춰져 있다. 이를 해결하기 위해서는 기존 소스 코드, facets() 함수에 scales = "free_y"를 입력하도록 한다.

추가적으로 대륙별로 확인하기 위해 aes() 함수 안에 fill = continent를 추가한다. 대신, geom_bar() 함수 안에 있던 fill = 'forest green'는 제거한다.

gapminder2$country <- factor(gapminder2$country, 
                     levels = gapminder2$country[order(gapminder2$gdpPercap)])

gapminder3 <- gapminder2 %>% 
  gather(key = "records", value = "value", c("lifeExp", "gdpPercap"))

var_names <- list(
  "lifeExp"   = "Life Expectancy" ,
  "gdpPercap" = "GDP Per Capita"
)

var_labeller <- function(variable,value){
  return(var_names[value])
}

ggplot(gapminder3, aes(x = country, y = value, fill = continent)) + 
  geom_bar(stat = 'identity') + 
  facet_wrap(~records, ncol = 1, strip.position = "left", labeller = var_labeller, scales = "free_y")

facets()를 활용한 그룹화

이제 마지막이다. 각 대륙별 나라를 한개씩 더 늘린 후, 대륙별로 그룹화를 하려고 한다. 또한 각 대륙별로 그룹화를 할 때, 공간으로 구분할 수 있도록 하려고 한다. 아래 전체 소스코드를 확인해본다.

그동안에는 facet_wrap() 함수를 사용했지만, 이번에는 facet_grid() 함수를 사용했다. 이렇게 변수 2개를 추가로 넣을 경우에는 facet_wrap() 함수보다는 facet_grid() 함수가 더 나을 수 있다.

library(dplyr)
gapminder2 <- gapminder %>% 
  filter(year == 2007, country %in% c("Australia", "Korea, Rep.", "Nigeria", "Germany", "United States", "Canada", "France", "South Africa", "Japan", "New Zealand"))

gapminder2$country <- factor(gapminder2$country, 
                     levels = gapminder2$country[order(gapminder2$gdpPercap)])

gapminder3 <- gapminder2 %>% 
  gather(key = "records", value = "value", c("lifeExp", "gdpPercap"))

var_names <- list(
  "lifeExp"   = "Life Expectancy" ,
  "gdpPercap" = "GDP Per Capita"
)

continent_names <- levels(gapminder3$continent)

var_labeller <- function(variable,value){
  if (variable=='records') {
    return(var_names[value])
  } else {
    return(continent_names)
  }
}

ggplot(gapminder3, aes(x = country, y = value, fill = continent)) + 
  geom_bar(stat = 'identity') + 
  facet_grid(records~continent, labeller = var_labeller, scales = "free", space="free_x") + 
  theme(legend.position = "none", axis.text.x = element_text(angle = 15, vjust = 0.8))

facets() 함수를 사용할 때, 입문자는 드디어 R의 편리성과 탁월함에 대해 느끼게 될 것이다. 위 코드안에는 단순히 시각화 코드 뿐 아니라 tidyr & dplyr 패키지 안에 있는 함수들도 같이 사용되어졌다. 또한, factor()와 levels() 함수를 사용하여 각 변수의 values() 추출하는 것도 포함되어 있다.

지금은 걱정안하셔도 된다. 시각화가 끝나고 나면 dplyr & tidyr 패키지에서 한번 더 다룰 예정이다.

지금까지 진행한 소스코드를 다른 데이터를 적용하여 해보도록 해보자. 실제 실무데이터를 활용해보면 훨씬 더 빠르게 습득 할 수 있고, 이해하기도 쉬울 것이다.

나에게 위 게시글에 영감을 준 facets() 포스트: Facets for ggplot in R

Edit

R Markdown 소개 및 환경설정

 

R Markdown Markdown Manual R Markdown

 

데이터 분석가의 주요 업무 중의 하나는 향후에 참고자료로 활용하기 위해 작업 결과물을 문서화 해야 하는데, 상당량의 보고서를 작성해서 분석과정과 출력 결과를 기술해야만 합니다.

보통의 과정은 아래과 같을 것입니다.

  • 1단계: 본인의 작업을 위해서 R 스크립트 작성

  • 2단계: 다양한 그래프가 첨부된 분석 결과를 Word, PPT 분석 결과를 기술해서 동료 또는 메신저로 분석 결과 전송

  • 3단계: 분석결과 토의

  • 4단계: 각각의 그래프 결과 코드를 매칭 하기 위한 작업이 토의 중 발생

  • 5단계: 혼란 및 불필요한 시간 소요 발생

그런데, 해당 작업물을 그 때 마다 웹페이지(HTML)를 생성하여 자체 서버 내 구축할 수 있다면, 그러면 위 5단계의 과정을 3단계(소스코드 작성웹 게시분석결과 토의)로 축소할 수가 있을 것이며 특히, 연구자가 분석 당시의 고민과 문제점들을 스크롤링과 함께 같이 고민할 수 있는 시간으로 빠져들 수 있도록 유도할 수 있습니다.

데이터 분석 보고서는 보고서의 작성이 연구자의 끝이 아니기 때문에 분석의 과정과 결과물을 잘 정리하여 의사결정을 하는데 반드시 도움이 되어야 하는 일종의 마지막 제안서와 같습니다.

본 게시물은 R을 처음 접하는 데이터 분석가를 위해서 작성하였습니다. 사내의 보고서 문화 혁신에 기여하기를 바라는 마음과 함께!!


Step 1. R 마크다운 파일 생성

R 마크다운 파일 생성은 아래와 같이 생성할 수 있습니다.
RStudio에서 File → New File → R Markdown을 클릭하시면 아래와 같이 대화 상자가 열립니다.

Title과 Author를 설정 한 후 HTML로 클릭합니다.


Step 2. R 마크다운 기본 구성요소

기본 구조는 아래와 같이 확인 될 것입니다.

구성 1. Header

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

...더보기
---
title: "Initial R Markdown document"
author: "Evan Jung"
date: "10/4/2019"
output: html_document
---

위 필드는 임의 삭제가 가능하나, 경험적으로는 포함시키는 것이 좋습니다.

구성 2. R 코드 덩어리 - Set Up

...더보기

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

위 구성은 R 마크다운 문서의 기본 Set Up 코드이기 때문에 유지하는 것을 원칙으로 합니다. 위 코드 상 옵션에 대한 설명은 아래와 같습니다.

  • setup: 소스코드 덩어리에 대한 title이며, 다른 소스코드 덩어리와 중복 작성 시, 에러가 발생합니다.

  • include=FALSE: 문서에는 포함시키지 않고, 몰래 실행할 수 있으며, 주로 최초 설정에 이용됩니다.

  • knitr::opts_chunk$set에서 디폴트 옵션을 설정할 수 있으며, echo = TRUE는 코드를 보여줍니다. 그 외 옵션은 아래를 확인하여 주시기를 바랍니다.1

    • eval = F: 코드 실행하지 않는다.

    • echo = F: 코드를 보여주지 않는다.

    • include=F: 실행 결과를 보여주지 않는다.

    • message=F: 실행 때 나오는 메시지를 보여주지 않는다.

    • warning=F: 실행 때 나오는 경고를 보여주지 않는다.

    • error=T: 에러가 있어도 실행하고 에러코드를 보여준다.

    • fig.height=(number): R에서 작성한 그래프를 그림의 높이를 조정할 수 있다.

    • fig.width=(number): R에서 작성한 그림의 넓이를 높이를 조정할 수 있다.

    • fig.align=’center’ : R에서 작성한 그림의 위치를 변경할 수 있다.

     

그 외 옵션을 확인하려면 아래와 같이 코드를 입력 후 실행하면 결과값이 나옵니다.

...더보기

knitr::opts_chunk$get()

구성 3. R 코드 덩어리 - 작업 코드 예제

...더보기

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

knitr로 실행되면, R 코드 덩어리를 실행결과와 함께 나타납니다.

Step 3. 마크다운(Markdown)문법에 대한 이해

마크다운은 2004년 12월에 처음 등장한 것으로 보입니다.2 마크다운을 활용하여 작성된 문서는 보다 쉽고 빠르게 HTML 등 다른 문서 형태로 변환이 가능합니다. 특별히, R Markdown은 R 사용자를 위한 Markdown으로 이해하시면 좋습니다.

기본 문법 1. Bold & Italic

별표*를 활용하여 굵게 또는 이탤릭체로 변환할 수 있습니다.

  • 굵게: **굵게(bold)**

  • 이탤릭: *이탤릭(italic)*

기본문법 2. 구분점

아래와 같이 하이픈- 혹은 별표*를 적용해서 구분점이 붙은 항목을 생성할 수 있습니다.

...더보기

* 위 그래프는 ~ 
* 위 표는 ~
* 따라서, ~

혹은 아래와 같이 작성도 가능합니다.

...더보기

- 위 그래프는 ~ 
- 위 표는 ~
- 따라서, ~

코드 실행 시, 다음과 같이 웹페이지로 보이게 됩니다.

  • 위 그래프는 ~

  • 위 표는 ~

  • 따라서, ~

숫자 사용을 활용한 구분점도 아래와 같이 적용하면 가능합니다.

...더보기

1. 위 그래프는 ~
2. 위 표는 ~
3. 따라서, ~

코드 실행 시, 다음과 같이 웹페이지로 보여지게 됩니다.

  1. 위 그래프는 ~

  2. 위 표는 ~

  3. 따라서, ~

기본 문법 3. 섹션 제목 만들기

섹션 제목을 만들려면 # 기호를 활용하여 각 라인 첫 번째 적용하게 되면 다른 크기를 갖는 섹션 제목을 만들 수 있을 뿐만 아니라, 위 섹션이 목차로 재 활용될 수 있습니다.

...더보기
# 첫번째 제목 (Title)
## 두번째 제목 (Main Section)
### 세번째 제목 (Sub-Section)
#### 네번째 제목 (Sub-sub section)

첫번째 제목 (Title)

두 번째 제목 (Main Section)

세 번째 제목 (Sub-Section)

네 번째 제목 (Sub-sub Section)

Step 4. 마크다운(Markdown) 다양한 기능 사용

기능 1. 하이퍼링크

독립적으로 링크 코드를 입력하거나, 또는 문장 중간에 삽입이 가능합니다. 아래와 같은 방법으로 입력하시면 됩니다.

...더보기

문법: [text](링크)
예시: [네이버](https://www.naver.com)

네이버 클릭하시면(→) 네이버 네이버 메인 화면에 연결됩니다.

기능 2. 이미지 삽입

아래와 같은 방법으로 이미지를 삽입할 수 있습니다.

...더보기

문법: ![caption](경로)
예시: ![타펀](./Ta-fun.png)

다만, image size 작업 조정을 직접 하려면 R 코드 덩어리에 아래와 같은 방법으로 작업할 수도 있습니다. (예: out.width=”400px”, out.height=”400px”)

...더보기

```{r, out.width = "400px"}
knitr::include_graphics("path/to/image.png")
```

다만, 경험적으로 봤을 때는 개별 이미지를 수정하려면 HTML 소스 코드 또는 소스코드를 직접 입력하는 것을 권장합니다.

test.Rmd

...더보기
---
title: "Initial R Markdown document"
author: "Evan Jung"
date: "10/4/2019"
output: html_document
css: test.css
---
 
## Page with an image {#myImagePage}
![Image](path/to/image)

test.css

...더보기

#myImagePage img {
  width: 400px;
  height: 200px;
}​

 

기능 3. LaTeX expression

수식 작성법은 Latex라는 문법을 참조해서 작성할 수 있습니다.

...더보기
$$ x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} $ 

기능 4. 인라인(Inline) R 코드

인라인 R코드를 활용하는 가장 궁극적인 목적은 보고서의 모든 숫자를 재현 가능하게 만들기 위해서입니다. 인라인 코드를 작성할 때 `r`을 사용합니다. 예를 들어, `r 2+2` 또는 `r round(some_value, 2)` . R 코드가 실행되어 코드가 결과 값으로 치환됩니다.

Step 5. 다른 언어와의 호환성 (고급)

R과 함께 파이썬 또는 SQL을 다루는 머신러닝 개발자가 있다고 가정합니다. 그러면 R Markdown 안에서도 python 코드를 실행 후 작업할 수가 있습니다. 다만, 이때에는 코드 덩어리를 파이썬 또는 sql로 명명해야 적용이 가능합니다.

예를 들면 아래와 같이 작성이 가능합니다.

...더보기

```{r}
summary(cars)
```
위 데이터의 결과값은 ~


```{python}
@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None
class SomeClass:
    pass
>>> message = '''interpreter
... prompt'''
```


(Option) 더 공부하기

위에서 제공한 자료를 가지고도 충분히 보고서를 작성하는 데는 부족함이 없습니다. 다만, 보고서를 조금 더 풍성하게 만들고자 한다면 매뉴얼을 참고해서 보다 전문적으로 작성하는 권장 합니다.


FAQ


  1. “R Markdown 기초”, “Zarathu Official Blog”, 2019년 1월 3일 수정, 2019년 10월 4일 접속, https://blog.zarathu.com/posts/2019-01-03-rmarkdown/
  2. “Markdown”, “Daring Fireball”, 2004년 12월 17일 수정, 2019년 10월 4일 접속, https://daringfireball.net/projects/markdown/
%0A%23%20R%20Markdown%20%uC18C%uAC1C%20%uBC0F%20%uD658%uACBD%uC124%uC815%0A%0A@%28R%20Markdown%29%5BMarkdown%7CManual%7CR%20Markdown%5D%0A%0A%uB370%uC774%uD130%20%uBD84%uC11D%uAC00%uC758%20%uC8FC%uC694%20%uC5C5%uBB34%20%uC911%uC758%20%uD558%uB098%uB294%20%uD5A5%uD6C4%uC5D0%20%uCC38%uACE0%uC790%uB8CC%uB85C%20%uD65C%uC6A9%uD558%uAE30%20%uC704%uD574%20%uC791%uC5C5%uACB0%uACFC%uB97C%20%uBB38%uC11C%uD654%20%uD574%uC57C%20%uD558%uB294%uB370%2C%20%uC0C1%uB2F9%uB7C9%uC758%20%uBCF4%uACE0%uC11C%uB97C%20%uC791%uC131%uD574%uC11C%20%uBD84%uC11D%uACFC%uC815%uACFC%20%uCD9C%uB825%uACB0%uACFC%uB97C%20%uAE30%uC220%uD574%uC57C%uB9CC%20%uD569%uB2C8%uB2E4.%20%0A%0A%uBCF4%uD1B5%uC758%20%uACFC%uC815%uC740%20%uC544%uB798%uACFC%20%uAC19%uC744%20%uAC83%uC785%uB2C8%uB2E4.%20%0A-%201%uB2E8%uACC4%3A%20%uBCF8%uC778%uC758%20%uC791%uC5C5%uC744%20%uC704%uD574%uC11C%20R%20%uC2A4%uD06C%uB9BD%uD2B8%20%uC791%uC131%0A-%202%uB2E8%uACC4%3A%20%uB2E4%uC591%uD55C%20%uADF8%uB798%uD504%uAC00%20%uCCA8%uBD80%uB41C%20%uBD84%uC11D%uACB0%uACFC%uB97C%20Word%2C%20PPT%20%uBD84%uC11D%uACB0%uACFC%uB97C%20%uAE30%uC220%uD574%uC11C%20%uB3D9%uB8CC%20%uB610%uB294%20%uBA54%uC2E0%uC800%uB85C%20%uBD84%uC11D%uACB0%uACFC%20%uC804%uC1A1%0A-%203%uB2E8%uACC4%3A%20%uBD84%uC11D%uACB0%uACFC%20%uD1A0%uC758%0A-%204%uB2E8%uACC4%3A%20%uAC01%uAC01%uC758%20%uADF8%uB798%uD504%20%uACB0%uACFC%20%uCF54%uB4DC%uB97C%20%uB9E4%uCE6D%uD558%uAE30%20%uC704%uD55C%20%uC791%uC5C5%uC774%20%uD1A0%uC758%20%uC911%20%uBC1C%uC0DD%0A-%205%uB2E8%uACC4%3A%20%uD63C%uB780%20%uBC0F%20%uBD88%uD544%uC694%uD55C%20%uC2DC%uAC04%20%uC18C%uC694%20%uBC1C%uC0DD%20%20%0A%0A%uADF8%uB7F0%uB370%2C%20%uD574%uB2F9%20%uC791%uC5C5%uBB3C%uC744%20%uADF8%20%uB54C%20%uB9C8%uB2E4%20%uC6F9%uD398%uC774%uC9C0%28HTML%29%uC744%20%uC0DD%uC131%uD558%uC5EC%20%uC790%uCCB4%20%uC11C%uBC84%uB0B4%20%uAD6C%uCD95%uD560%20%uC218%20%uC788%uB2E4%uBA74%2C%20%uADF8%uB7EC%uBA74%20%uC704%205%uB2E8%uACC4%uC758%20%uACFC%uC815%uC744%203%uB2E8%uACC4%28**%uC18C%uC2A4%uCF54%uB4DC%20%uC791%uC131**%20%26%238594%20**%uC6F9%20%uAC8C%uC2DC**%20%26%238594%20**%uBD84%uC11D%uACB0%uACFC%20%uD1A0%uC758**%29%uB85C%20%uCD95%uC18C%uD560%20%uC218%uAC00%20%uC788%uC744%20%uAC83%uC774%uBA70%20%uD2B9%uD788%2C%20%uC5F0%uAD6C%uC790%uAC00%20%uBD84%uC11D%20%uB2F9%uC2DC%uC758%20%uACE0%uBBFC%uACFC%20%uBB38%uC81C%uC810%uB4E4%uC744%20%uC2A4%uD06C%uB864%uB9C1%uACFC%20%uD568%uAED8%20%uAC19%uC774%20%uACE0%uBBFC%uD560%20%uC218%20%uC788%uB294%20%uC2DC%uAC04%uC73C%uB85C%20%uBE60%uC838%uB4E4%20%uC218%20%uC788%uB3C4%uB85D%20%uC720%uB3C4%uD560%20%uC218%20%uC788%uC2B5%uB2C8%uB2E4.%20%0A%0A%uB370%uC774%uD130%20%uBD84%uC11D%20%uBCF4%uACE0%uC11C%uB294%20%uBCF4%uACE0%uC11C%uC758%20%uC791%uC131%uC774%20%uC5F0%uAD6C%uC790%uC758%20%uB05D%uC774%20%uC544%uB2C8%uB77C%20%uACB0%uACFC%uBB3C%uC744%20%uD1A0%uB300%uB85C%20%uC758%uC0AC%uACB0%uC815%uC744%20%uD558%uB294%uB370%20%uBC18%uB4DC%uC2DC%20%uC218%uBC18%uB418%uC5B4%uC57C%20%uD560%20%uACFC%uC815%uC774%uAE30%20%uB54C%uBB38%uC785%uB2C8%uB2E4.%20%uBCF8%20%uAC8C%uC2DC%uBB3C%uC740%20R%uC744%20%uCC98%uC74C%20%uC811%uD558%uB294%20%uB370%uC774%uD130%20%uBD84%uC11D%uAC00%uB97C%20%uC704%uD574%uC11C%20%uC791%uC131%uD558%uC600%uC2B5%uB2C8%uB2E4.%20%0A%0A%uC0AC%uB0B4%uC758%20%uBCF4%uACE0%uC11C%20%uBB38%uD654%20%uD601%uC2E0%uC5D0%20%uAE30%uC5EC%uD558%uAE30%uB97C%20%uBC14%uB77C%uB294%20%uB9C8%uC74C%uACFC%20%uD568%uAED8%21%21%0A%0A----------%0A%0A%0A%0A%5BTOC%5D%0A%0A%23%23%20Step%201.%20R%20%uB9C8%uD06C%uB2E4%uC6B4%20%uD30C%uC77C%20%uC0DD%uC131%0AR%20%uB9C8%uD06C%uB2E4%uC6B4%20%uD30C%uC77C%20%uC0DD%uC131%uC740%20%uC544%uB798%uC640%20%uAC19%uC774%20%uC0DD%uC131%uD560%20%uC218%20%uC788%uC2B5%uB2C8%uB2E4.%20%0ARStudio%uC5D0%uC11C%20File%20%26%238594%20New%20File%20%26%238594%20R%20Markdown%uC744%20%uD074%uB9AD%uD558%uC2DC%uBA74%20%uC544%uB798%uC640%20%uAC19%uC774%20%uB300%uD654%uC0C1%uC790%uAC00%20%uC5F4%uB9BD%uB2C8%uB2E4.%20%0A%21%5Bnew%20r%20markdown%5D%28./R%20Markdown.png%29%0A%0ATitle%uACFC%20Author%uB97C%20%uC124%uC815%20%uD55C%20%uD6C4%20HTML%uB85C%20%uD074%uB9AD%uD569%uB2C8%uB2E4.%20%0A%0A%23%23%20Step%202.%20R%20%uB9C8%uD06C%uB2E4%uC6B4%20%uAE30%uBCF8%20%uAD6C%uC131%uC694%uC18C%0A%uAE30%uBCF8%20%uAD6C%uC870%uB294%20%uC544%uB798%uC640%20%uAC19%uC774%20%uD655%uC778%20%uB420%20%uAC83%uC785%uB2C8%uB2E4.%20%0A%21%5BAlt%20text%5D%28./R%20Markdown%20Basic.png%29%0A%0A%23%23%23%20%uAD6C%uC131%201.%20Header%0A%uCD08%uAE30%20%uC124%uC815%uB41C%20%uD14D%uC2A4%uD2B8%20%uB369%uC5B4%uB9AC%uC5D0%20R%uC5D0%20%uB300%uD55C%20%uC9C0%uC2DC%uC0AC%uD56D%uC774%20%uB2F4%uACA8%uC788%uB2E4%3A%20%uC81C%uBAA9%2C%20%uC800%uC790%uBA85%2C%20%uB0A0%uC9DC%2C%20html%20%uCD9C%uB825%uBB3C%28%uB2E4%uB978%20%uB9D0%uB85C%2C%20%uC6F9%uD398%uC774%uC9C0%29%uC744%20%uC0DD%uC131%uD560%uC9C0%uAC00%20%uD3EC%uD568%uB429%uB2C8%uB2E4.%20%0A%60%60%60r%0A---%0Atitle%3A%20%22Initial%20R%20Markdown%20document%22%0Aauthor%3A%20%22Evan%20Jung%22%0Adate%3A%20%2210/4/2019%22%0Aoutput%3A%20html_document%0A---%0A%60%60%60%0A%uC704%20%uD544%uB4DC%uB294%20%uC784%uC758%20%uC0AD%uC81C%uAC00%20%uAC00%uB2A5%uD558%uB098%2C%20%uACBD%uD5D8%uC801%uC73C%uB85C%uB294%20%uD3EC%uD568%20%uC2DC%uD0A4%uB294%20%uAC83%uC774%20%uC88B%uC2B5%uB2C8%uB2E4.%0A%0A%23%23%23%20%uAD6C%uC131%202.%20R%20%uCF54%uB4DC%20%uB369%uC5B4%uB9AC%20-%20Set%20Up%0A%3Cpre%3E%0A%26%2396%3B%26%2396%3B%26%2396%3B%7Br%20setup%2C%20include%3DFALSE%7D%0Aknitr%3A%3Aopts_chunk%24set%28echo%20%3D%20TRUE%29%0A%26%2396%3B%26%2396%3B%26%2396%3B%0A%3C/pre%3E%0A%0A%uC704%20%uAD6C%uC131%uC740%20R%20%uB9C8%uD06C%uB2E4%uC6B4%20%uBB38%uC11C%uC758%20%uAE30%uBCF8%20Set%20Up%20%uCF54%uB4DC%uC774%uAE30%20%uB54C%uBB38%uC5D0%20%uC720%uC9C0%uD558%uB294%20%uAC83%uC744%20%uC6D0%uCE59%uC73C%uB85C%20%uD569%uB2C8%uB2E4.%20%uC704%20%uCF54%uB4DC%20%uC0C1%20%uC635%uC158%uC5D0%20%uB300%uD55C%20%uC124%uBA85%uC740%20%uC544%uB798%uC640%20%uAC19%uC2B5%uB2C8%uB2E4.%0A-%20setup%3A%20%uC18C%uC2A4%uCF54%uB4DC%20%uB369%uC5B4%uB9AC%uC5D0%20%uB300%uD55C%20title%uC774%uBA70%2C%20%uB2E4%uB978%20%uC18C%uC2A4%uCF54%uB4DC%20%uB369%uC5B4%uB9AC%uC640%20%uC911%uBCF5%20%uC791%uC131%20%uC2DC%2C%20%uC5D0%uB7EC%uAC00%20%uBC1C%uC0DD%uD569%uB2C8%uB2E4.%20%0A-%20include%3DFALSE%3A%20%uBB38%uC11C%uC5D0%uB294%20%uD3EC%uD568%uC2DC%uD0A4%uC9C0%20%uC54A%uACE0%2C%20%uBAB0%uB798%20%uC2E4%uD589%uD560%20%uC218%20%uC788%uC73C%uBA70%2C%20%uC8FC%uB85C%20%uCD5C%uCD08%20%uC124%uC815%uC5D0%20%uC774%uC6A9%uB429%uB2C8%uB2E4.%20%0A-%20knitr%3A%3Aopts_chunk%24set%uC5D0%uC11C%20%uB514%uD3F4%uD2B8%20%uC635%uC158%uC744%20%uC124%uC815%uD560%20%uC218%20%uC788%uC73C%uBA70%2C%20echo%20%3D%20TRUE%uB294%20%uCF54%uB4DC%uB97C%20%uBCF4%uC5EC%uC90D%uB2C8%uB2E4.%20%uADF8%20%uC678%20%uC635%uC158%uC740%20%uC544%uB798%uB97C%20%uD655%uC778%uD558%uC5EC%20%uC8FC%uC2DC%uAE30%uB97C%20%uBC14%uB78D%uB2C8%uB2E4.%5B%5E1%5D%0A%09-%20**eval%20%3D%20F**%3A%20%uCF54%uB4DC%20%uC2E4%uD589%uD558%uC9C0%20%uC54A%uB294%uB2E4.%0A%09-%20**echo%20%3D%20F**%3A%20%uCF54%uB4DC%uB97C%20%uBCF4%uC5EC%uC8FC%uC9C0%20%uC54A%uB294%uB2E4.%20%0A%09-%20**include%3DF**%3A%20%uC2E4%uD589%20%uACB0%uACFC%uB97C%20%uBCF4%uC5EC%uC8FC%uC9C0%20%uC54A%uB294%uB2E4.%20%0A%09-%20**message%3DF**%3A%20%uC2E4%uD589%20%uB54C%20%uB098%uC624%uB294%20%uBA54%uC138%uC9C0%uB97C%20%uBCF4%uC5EC%uC8FC%uC9C0%20%uC54A%uB294%uB2E4.%20%0A%09-%20**warning%3DF**%3A%20%uC2E4%uD589%20%uB54C%20%uB098%uC624%uB294%20%uACBD%uACE0%uB97C%20%uBCF4%uC5EC%uC8FC%uC9C0%20%uC54A%uB294%uB2E4.%20%0A%09-%20**error%3DT**%3A%20%uC5D0%uB7EC%uAC00%20%uC788%uC5B4%uB3C4%20%uC2E4%uD589%uD558%uACE0%20%uC5D0%uB7EC%uCF54%uB4DC%uB97C%20%uBCF4%uC5EC%uC900%uB2E4.%20%0A%09-%20**fig.height%3D%28number%29**%3A%20R%uC5D0%uC11C%20%uC791%uC131%uD55C%20%uADF8%uB798%uD504%uB97C%20%uADF8%uB9BC%uC758%20%uB192%uC774%uB97C%20%uC870%uC815%uD560%20%uC218%20%uC788%uB2E4.%20%0A%09-%20**fig.width%3D%28number%29**%3A%20R%uC5D0%uC11C%20%uC791%uC131%uD55C%20%uADF8%uB9BC%uC758%20%uB113%uC774%uB97C%20%uB192%uC774%uB97C%20%uC870%uC815%uD560%20%uC218%20%uC788%uB2E4.%20%0A%09-%20**fig.align%3D%27center%27**%20%3A%20R%uC5D0%uC11C%20%uC791%uC131%uD55C%20%uADF8%uB9BC%uC758%20%uC704%uCE58%uB97C%20%uBCC0%uACBD%uD560%20%uC218%20%uC788%uB2E4.%20%0A%0A%uADF8%20%uC678%20%uC635%uC158%uC744%20%uD655%uC778%uD558%uB824%uBA74%20%uC544%uB798%uC640%20%uAC19%uC774%20%uCF54%uB4DC%uB97C%20%uC785%uB825%20%uD6C4%20%uC2E4%uD589%uD558%uBA74%20%uACB0%uACFC%uAC12%uC774%20%uB098%uC635%uB2C8%uB2E4.%20%0A%3Cpre%3E%0Aknitr%3A%3Aopts_chunk%24get%28%29%0A%3C/pre%3E%0A%0A%5B%5E1%5D%3A%20%22R%20Markdown%20%uAE30%uCD08%22%2C%20%22Zarathu%20Official%20Blog%22%2C%202019%uB144%201%uC6D4%203%uC77C%20%uC218%uC815%2C%202019%uB144%2010%uC6D4%204%uC77C%20%uC811%uC18D%2C%20https%3A//blog.zarathu.com/posts/2019-01-03-rmarkdown/%20%0A%0A%23%23%23%20%uAD6C%uC131%203.%20R%20%uCF54%uB4DC%20%uB369%uC5B4%uB9AC%20-%20%uC791%uC5C5%uCF54%uB4DC%20%uC608%uC81C%0A%3Cpre%3E%0A%26%2396%3B%26%2396%3B%26%2396%3B%7Br%7D%0Asummary%28cars%29%0A%26%2396%3B%26%2396%3B%26%2396%3B%0A%3C/pre%3E%0A%60knitr%60%uB85C%20%uC2E4%uD589%uB418%uBA74%2C%20R%20%uCF54%uB4DC%20%uB369%uC5B4%uB9AC%uB97C%20%uC2E4%uD589%uACB0%uACFC%uC640%20%uD568%uAED8%20%uB098%uD0C0%uB0A9%uB2C8%uB2E4.%20%20%0A%0A%23%23%20Step%203.%20%uB9C8%uD06C%uB2E4%uC6B4%28Markdown%29%uBB38%uBC95%uC5D0%20%uB300%uD55C%20%uC774%uD574%0A%uB9C8%uD06C%uB2E4%uC6B4%uC740%202004%uB144%2012%uC6D4%uC5D0%20%uCC98%uC74C%20%uB4F1%uC7A5%uD55C%20%uAC83%uC73C%uB85C%20%uBCF4%uC785%uB2C8%uB2E4.%5B%5E2%5D%20%uB9C8%uD06C%uB2E4%uC6B4%uC744%20%uD65C%uC6A9%uD558%uC5EC%20%uC791%uC131%uB41C%20%uBB38%uC11C%uB294%20%uBCF4%uB2E4%20%uC27D%uACE0%20%uBE60%uB974%uAC8C%20HTML%20%uB4F1%20%uB2E4%uB978%20%uBB38%uC11C%20%uD615%uD0DC%uB85C%20%uBCC0%uD658%uC774%20%uAC00%uB2A5%uD569%uB2C8%uB2E4.%20%uD2B9%uBCC4%uD788%2C%20R%20Markdown%uC740%20R%uC0AC%uC6A9%uC790%uB97C%20%uC704%uD55C%20Markdown%uC73C%uB85C%20%uC774%uD574%uD558%uC2DC%uBA74%20%uC88B%uC2B5%uB2C8%uB2E4.%20%0A%0A%5B%5E2%5D%3A%20%22Markdown%22%2C%20%22Daring%20Fireball%22%2C%202004%uB144%2012%uC6D4%2017%uC77C%20%uC218%uC815%2C%202019%uB144%2010%uC6D4%204%uC77C%20%uC811%uC18D%2C%20https%3A//daringfireball.net/projects/markdown/%0A%0A%23%23%23%20%uAE30%uBCF8%uBB38%uBC95%201.%20Bold%20%26%20Italic%0A%uBCC4%uD45C%60*%60%uB97C%20%uD65C%uC6A9%uD558%uC5EC%20%uAD75%uAC8C%20%uB610%uB294%20%uC774%uD0E4%uB9AD%uCCB4%uB85C%20%uBCC0%uD658%uD560%20%uC218%20%uC788%uC2B5%uB2C8%uB2E4.%20%0A-%20**%uAD75%uAC8C**%3A%20%60**%uAD75%uAC8C%28bold%29**%60%20%0A-%20*%uC774%uD0E4%uB9AD*%3A%20%60*%uC774%uD0E4%uB9AD%28italic%29*%60%20%0A%0A%23%23%23%20%uAE30%uBCF8%uBB38%uBC95%202.%20%uAD6C%uBD84%uC810%0A%uC544%uB798%uC640%20%uAC19%uC774%20%uD558%uC774%uD508%60-%60%20%uD639%uC740%20%uBCC4%uD45C%60*%60%uB97C%20%uC801%uC6A9%uD574%uC11C%20%uAD6C%uBD84%uC810%uC774%20%uBD99%uC740%20%uD56D%uBAA9%uC744%20%uC0DD%uC131%uD560%20%uC218%20%uC788%uC2B5%uB2C8%uB2E4.%20%0A%3Cpre%3E%0A*%20%uC704%20%uADF8%uB798%uD504%uB294%20%7E%20%0A*%20%uC704%20%uD45C%uB294%20%7E%0A*%20%uB530%uB77C%uC11C%2C%20%7E%0A%3C/pre%3E%0A%uD639%uC740%20%uC544%uB798%uC640%20%uAC19%uC774%20%uC791%uC131%uB3C4%20%uAC00%uB2A5%uD569%uB2C8%uB2E4.%20%0A%3Cpre%3E%0A-%20%uC704%20%uADF8%uB798%uD504%uB294%20%7E%20%0A-%20%uC704%20%uD45C%uB294%20%7E%0A-%20%uB530%uB77C%uC11C%2C%20%7E%0A%3C/pre%3E%0A%uCF54%uB4DC%20%uC2E4%uD589%20%uC2DC%2C%20%uB2E4%uC74C%uACFC%20%uAC19%uC774%20%uC6F9%uD398%uC774%uC9C0%uB85C%20%uBCF4%uC5EC%uC9C0%uAC8C%20%uB429%uB2C8%uB2E4.%20%0A-%20%uC704%20%uADF8%uB798%uD504%uB294%20%7E%0A-%20%uC704%20%uD45C%uB294%20%7E%0A-%20%uB530%uB77C%uC11C%2C%20%7E%0A%0A%uC22B%uC790%20%uC0AC%uC6A9%uC744%20%uD65C%uC6A9%uD55C%20%uAD6C%uBD84%uC810%uB3C4%20%uC544%uB798%uC640%20%uAC19%uC774%20%uC801%uC6A9%uD558%uBA74%20%uAC00%uB2A5%uD569%uB2C8%uB2E4.%20%0A%3Cpre%3E%0A1.%20%uC704%20%uADF8%uB798%uD504%uB294%20%7E%0A2.%20%uC704%20%uD45C%uB294%20%7E%0A3.%20%uB530%uB77C%uC11C%2C%20%7E%0A%3C/pre%3E%0A%uCF54%uB4DC%20%uC2E4%uD589%20%uC2DC%2C%20%uB2E4%uC74C%uACFC%20%uAC19%uC774%20%uC6F9%uD398%uC774%uC9C0%uB85C%20%uBCF4%uC5EC%uC9C0%uAC8C%20%uB429%uB2C8%uB2E4.%20%0A1.%20%uC704%20%uADF8%uB798%uD504%uB294%20%7E%0A2.%20%uC704%20%uD45C%uB294%20%7E%0A3.%20%uB530%uB77C%uC11C%2C%20%7E%0A%0A%23%23%23%20%uAE30%uBCF8%uBB38%uBC95%203.%20%uC139%uC158%20%uC81C%uBAA9%20%uB9CC%uB4E4%uAE30%0A%uC139%uC158%20%uC81C%uBAA9%uC744%20%uB9CC%uB4E4%uB824%uBA74%20%60%23%60%20%20%uAE30%uD638%uB97C%20%uD65C%uC6A9%uD558%uC5EC%20%uAC01%20%uB77C%uC778%20%uCCAB%uBC88%uC9F8%20%uC801%uC6A9%uD558%uAC8C%20%uB418%uBA74%20%uB2E4%uB978%20%uD06C%uAE30%uB97C%20%uAC16%uB294%20%uC139%uC158%20%uC81C%uBAA9%uC744%20%uB9CC%uB4E4%20%uC218%20%uC788%uC744%20%uBFD0%uB9CC%20%uC544%uB2C8%uB77C%2C%20%uC704%20%uC139%uC158%uC774%20%uBAA9%uCC28%uB85C%20%uC7AC%20%uD65C%uC6A9%uB420%20%uC218%20%uC788%uC2B5%uB2C8%uB2E4.%20%0A%60%60%60%0A%23%20%uCCAB%uBC88%uC9F8%20%uC81C%uBAA9%20%28Title%29%0A%23%23%20%uB450%uBC88%uC9F8%20%uC81C%uBAA9%20%28Main%20Section%29%0A%23%23%23%20%uC138%uBC88%uC9F8%20%uC81C%uBAA9%20%28Sub-Section%29%0A%23%23%23%23%20%uB124%uBC88%uC9F8%20%uC81C%uBAA9%20%28Sub-sub%20section%29%0A%60%60%60%0A%23%20%uCCAB%uBC88%uC9F8%20%uC81C%uBAA9%20%28Title%29%0A%23%23%20%uB450%uBC88%uC9F8%20%uC81C%uBAA9%20%28Main%20Section%29%0A%23%23%23%20%uC138%uBC88%uC9F8%20%uC81C%uBAA9%20%28Sub-Section%29%0A%23%23%23%23%20%uB124%uBC88%uC9F8%20%uC81C%uBAA9%20%28Sub-sub%20Section%29%0A%0A%23%23%20Step%204.%20%uB9C8%uD06C%uB2E4%uC6B4%28Markdown%29%20%uB2E4%uC591%uD55C%20%uAE30%uB2A5%20%uC0AC%uC6A9%0A%23%23%23%20%uAE30%uB2A5%201.%20%uD558%uC774%uD37C%uB9C1%uD06C%0A%uB3C5%uB9BD%uC801%uC73C%uB85C%20%uB9C1%uD06C%20%uCF54%uB4DC%uB97C%20%uC785%uB825%uD558%uAC70%uB098%2C%20%uB610%uB294%20%uBB38%uC7A5%20%uC911%uAC04%uC5D0%20%uC0BD%uC785%uC774%20%uAC00%uB2A5%uD569%uB2C8%uB2E4.%20%uC544%uB798%uC640%20%uAC19%uC740%20%uBC29%uBC95%uC73C%uB85C%20%uC785%uB825%uD558%uC2DC%uBA74%20%uB429%uB2C8%uB2E4.%20%0A%60%60%60%0A%uBB38%uBC95%3A%20%5Btext%5D%28%uB9C1%uD06C%29%0A%uC608%uC2DC%3A%20%5B%uB124%uC774%uBC84%5D%28https%3A//www.naver.com%29%0A%60%60%60%0A%uB124%uC774%uBC84%20%uD074%uB9AD%uD558%uC2DC%uBA74%28%26%238594%29%20%5B%uB124%uC774%uBC84%5D%28https%3A//www.naver.com%29%20%uB124%uC774%uBC84%20%uBA54%uC778%20%uD654%uBA74%uC5D0%20%uC5F0%uACB0%uB429%uB2C8%uB2E4.%20%0A%0A%23%23%23%20%uAE30%uB2A5%202.%20%uC774%uBBF8%uC9C0%20%uC0BD%uC785%0A%uC544%uB798%uC640%20%uAC19%uC740%20%uBC29%uBC95%uC73C%uB85C%20%uC774%uBBF8%uC9C0%uB97C%20%uC0BD%uC785%uD560%20%uC218%20%uC788%uC2B5%uB2C8%uB2E4.%20%0A%60%60%60%0A%uBB38%uBC95%3A%20%21%5Bcaption%5D%28%uACBD%uB85C%29%0A%uC608%uC2DC%3A%20%21%5B%uD0C0%uD380%5D%28./Ta-fun.png%29%0A%60%60%60%0A%21%5B%uD0C0%uD380%5D%28./Ta-fun.png%29%20%0A%0A%uB2E4%uB9CC%2C%20image%20size%20%uC791%uC5C5%20%uC870%uC815%uC744%20%uC9C1%uC811%20%uD558%uB824%uBA74%20R%20%uCF54%uB4DC%20%uB369%uC5B4%uB9AC%uC5D0%20%uC544%uB798%uC640%20%uAC19%uC740%20%uBC29%uBC95%uC73C%uB85C%20%uC791%uC5C5%uD560%uC218%uB3C4%20%uC788%uC2B5%uB2C8%uB2E4.%20%28%uC608%3A%20out.width%3D%22400px%22%2C%20out.height%3D%22400px%22%29%0A%3Cpre%3E%0A%26%2396%3B%26%2396%3B%26%2396%3B%7Br%2C%20out.width%20%3D%20%22400px%22%7D%0Aknitr%3A%3Ainclude_graphics%28%22path/to/image.png%22%29%0A%26%2396%3B%26%2396%3B%26%2396%3B%0A%3C/pre%3E%0A%uB2E4%uB9CC%2C%20%uACBD%uD5D8%uC801%uC73C%uB85C%20%uBD24%uC744%20%uB54C%uB294%20%uAC1C%uBCC4%20%uC774%uBBF8%uC9C0%uB97C%20%uC218%uC815%uD558%uB824%uBA74%20HTML%20%uC18C%uC2A4%20%uCF54%uB4DC%20%uB610%uB294%20%uC18C%uC2A4%uCF54%uB4DC%uB97C%20%uC9C1%uC811%20%uC785%uB825%uD558%uB294%20%uAC83%uC744%20%uAD8C%uC7A5%uD569%uB2C8%uB2E4.%20%20%0A%3Cbr%3E%0Atest.Rmd%0A%60%60%60r%0A---%0Atitle%3A%20%22Initial%20R%20Markdown%20document%22%0Aauthor%3A%20%22Evan%20Jung%22%0Adate%3A%20%2210/4/2019%22%0Aoutput%3A%20html_document%0Acss%3A%20test.css%0A---%0A%0A%23%23%20Page%20with%20an%20image%20%7B%23myImagePage%7D%0A%21%5BImage%5D%28path/to/image%29%0A%60%60%60%0A%3Cbr%3E%0Atest.css%0A%60%60%60css%0A%23myImagePage%20img%20%7B%0A%20%20width%3A%20400px%3B%0A%20%20height%3A%20200px%3B%0A%7D%0A%60%60%60%0A%0A%23%23%23%20%uAE30%uB2A5%203.%20LaTeX%20expression%0A%uC218%uC2DD%uC791%uC131%uBC95%uC740%20%5BLatex%5D%28https%3A//www.latex-project.org/%29%uB77C%uB294%20%uBB38%uBC95%uC744%20%uCC38%uC870%uD574%uC11C%20%uC791%uC131%uD560%20%uC218%20%uC788%uC2B5%uB2C8%uB2E4.%20%0A%60%60%60%0A%24%24%09x%20%3D%20%5Cdfrac%7B-b%20%5Cpm%20%5Csqrt%7Bb%5E2%20-%204ac%7D%7D%7B2a%7D%20%24%24%0A%60%60%60%0A%24%24%09x%20%3D%20%5Cdfrac%7B-b%20%5Cpm%20%5Csqrt%7Bb%5E2%20-%204ac%7D%7D%7B2a%7D%20%24%24%0A%0A%23%23%23%20%uAE30%uB2A5%204.%20%uC778%uB77C%uC778%28Inline%29%20R%20%uCF54%uB4DC%0A%uC778%uB77C%uC778%20R%uCF54%uB4DC%uB97C%20%uD65C%uC6A9%uD558%uB294%20%uAC00%uC7A5%20%uAD81%uADF9%uC801%uC778%20%uBAA9%uC801%uC740%20%uBCF4%uACE0%uC11C%uC758%20%uBAA8%uB4E0%20%uC22B%uC790%uB97C%20%uC7AC%uD604%uAC00%uB2A5%uD558%uAC8C%20%uB9CC%uB4E4%uAE30%20%uC704%uD574%uC11C%uC785%uB2C8%uB2E4.%20%uC778%uB77C%uC778%20%uCF54%uB4DC%uB97C%20%uC791%uC131%uD560%20%uB54C%20%3Ccode%3E%26%2396%3Br%3C/code%3E%uC640%20%3Ccode%3E%26%2396%3B%3C/code%3E%uC744%20%uC0AC%uC6A9%uD569%uB2C8%uB2E4.%20%uC608%uB97C%20%uB4E4%uC5B4%2C%20%3Ccode%3E%26%2396%3Br%202+2%26%2396%3B%3C/code%3E%20%uB610%uB294%20%3Ccode%3E%26%2396%3Br%20round%28some_value%2C%202%29%26%2396%3B%3C/code%3E%20.%20R%20%uCF54%uB4DC%uAC00%20%uC2E4%uD589%uB418%uC5B4%20%uCF54%uB4DC%uAC00%20%uACB0%uACFC%20%uAC12%uC73C%uB85C%20%uCE58%uD658%uB429%uB2C8%uB2E4.%20%0A%0A%23%23%20Step%205.%20%uB2E4%uB978%20%uC5B8%uC5B4%uC640%uC758%20%uD638%uD658%uC131%20%28%uACE0%uAE09%29%0AR%uACFC%20%uD568%uAED8%20%uD30C%uC774%uC36C%20%uB610%uB294%20SQL%uC744%20%uB2E4%uB8E8%uB294%20%uBA38%uC2E0%uB7EC%uB2DD%20%uAC1C%uBC1C%uC790%uAC00%20%uC788%uB2E4%uACE0%20%uAC00%uC815%uD569%uB2C8%uB2E4.%20%uADF8%uB7EC%uBA74%20R%20Markdown%20%uC548%uC5D0%uC11C%uB3C4%20python%20%uCF54%uB4DC%uB97C%20%uC2E4%uD589%20%uD6C4%20%uC791%uC5C5%uD560%20%uC218%uAC00%20%uC788%uC2B5%uB2C8%uB2E4.%20%uB2E4%uB9CC%2C%20%uC774%uB54C%uC5D0%uB294%20%uCF54%uB4DC%20%uB369%uC5B4%uB9AC%uB97C%20%uD30C%uC774%uC36C%20%uB610%uB294%20sql%uB85C%20%uBA85%uBA85%uD574%uC57C%20%uC801%uC6A9%uC774%20%uAC00%uB2A5%uD569%uB2C8%uB2E4.%20%0A%0A%uC608%uB97C%20%uB4E4%uBA74%20%uC544%uB798%uC640%20%uAC19%uC774%20%uC791%uC131%uC774%20%uAC00%uB2A5%uD569%uB2C8%uB2E4.%20%20%0A%3Cpre%3E%0A%26%2396%3B%26%2396%3B%26%2396%3B%7Br%7D%0Asummary%28cars%29%0A%26%2396%3B%26%2396%3B%26%2396%3B%0A%uC704%20%uB370%uC774%uD130%uC758%20%uACB0%uACFC%uAC12%uC740%20%7E%0A%3Cbr%3E%0A%26%2396%3B%26%2396%3B%26%2396%3B%7Bpython%7D%0A@requires_authorization%0Adef%20somefunc%28param1%3D%27%27%2C%20param2%3D0%29%3A%0A%20%20%20%20%27%27%27A%20docstring%27%27%27%0A%20%20%20%20if%20param1%20%3E%20param2%3A%20%23%20interesting%0A%20%20%20%20%20%20%20%20print%20%27Greater%27%0A%20%20%20%20return%20%28param2%20-%20param1%20+%201%29%20or%20None%0Aclass%20SomeClass%3A%0A%20%20%20%20pass%0A%3E%3E%3E%20message%20%3D%20%27%27%27interpreter%0A...%20prompt%27%27%27%0A%26%2396%3B%26%2396%3B%26%2396%3B%0A%3C/pre%3E%0A%0A%23%23%20%28Option%29%20%uB354%20%uACF5%uBD80%uD558%uAE30%0A%uC704%uC5D0%uC11C%20%uC81C%uACF5%uD55C%20%uC790%uB8CC%uB97C%20%uAC00%uC9C0%uACE0%uB3C4%20%uCDA9%uBD84%uD788%20%uBCF4%uACE0%uC11C%uB97C%20%uC791%uC131%uD558%uB294%uB370%uB294%20%uBD80%uC871%uD568%uC774%20%uC5C6%uC2B5%uB2C8%uB2E4.%20%uB2E4%uB9CC%2C%20%uBCF4%uACE0%uC11C%uB97C%20%uC870%uAE08%20%uB354%20%uD48D%uC131%uD558%uAC8C%20%uB9CC%uB4E4%uACE0%uC790%20%uD55C%uB2E4%uBA74%20%uBA54%uB274%uC5BC%uC744%20%uCC38%uACE0%uD574%uC11C%20%uBCF4%uB2E4%20%uC804%uBB38%uC801%uC73C%uB85C%20%uC791%uC131%uD558%uB294%20%uAD8C%uC7A5%uD569%uB2C8%uB2E4.%20%0A-%20%5BR%20Markdown%20%uACF5%uC2DD%20%uD648%uD398%uC774%uC9C0%5D%28https%3A//rmarkdown.rstudio.com/%29%0A-%20%5BR%20%uB9C8%uD06C%uB2E4%uC6B4%20%uACF5%uC2DD%20%uBA54%uB274%uC5BC%5D%28https%3A//bookdown.org/yihui/rmarkdown/%29%0A-%20%5BR%20%uB9C8%uD06C%uB2E4%uC6B4%20Cheet%20Sheet%20%20PDF%20%uD30C%uC77C%20%uB2E4%uC6B4%uB85C%uB4DC%5D%28https%3A//github.com/rstudio/cheatsheets/raw/master/rmarkdown-2.0.pdf%29%0A%0A%23%23%20FAQ%0A-%20Email%3A%20%3Cj2hoon85@gmail.com%3E%0A

 

'R > [R] 잡동사니' 카테고리의 다른 글

Jupyter Notebook + R 연동하기  (1) 2019.01.24

+ Recent posts