본문으로 바로가기



티스토리 블로그를 위한 R 팩키지 - R4Tistory

category R4Tistory패키지 2017.06.08 15:23
티스토리 블로그를 위한 R 팩키지 - R4Tistory

이전 티스토리 블로그에 R코드 하이라이팅 적용하기에서 필자가 티스토리 블로그에서의 R코드 하이라이팅을 위한 세팅하는 방법에 대하여 다룬 적이 있다. 이번 포스팅에서는 지극히 필자의 개인적인 용도(공부 및 일일이 함수 로드하는 귀차니즘번거로움 제거)로 만들어본 R4Tistory라는 팩키지 사용법을 다뤄보고자 한다.

티스토리 블로그에서의 R코드 하이라이팅을 제대로 하기 위해서는, html 결과물의 R코드 태그 클래스 이름을 Prism.js에서 사용하는 “language-r” 태그를 적용하는게 좋다. 자세한 사항은 위의 링크를 참고하자.

따라서 티스토리용 plain html파일 Rmarkdown 세팅 후 knitr의 결과물로 나온 html파일의 코드 태그 클래스를 ctrl+F로 찾아서 바꿔주기만 하면 끝이지만, 다음의 두 가지 이유에서 R4Tistory 팩키지를 만들게 되었다.

    1. 매번 결과물을 찾아 바꿔주는 것이 너무 불편하다.
    1. 매번 티스토리에 접속해서 글 올리는 것도 너무 귀찮다.

1번의 경우는 현재 팩키지가 가지고 있는 knitr4blog함수로 해결이 가능하게 되었다. 2번 문제는 앞으로 티스토리 API를 열심히 공부해서 팩키지에 티스토리 아이디와 비번을 입력값으로 한 함수형태로 만들어서 넣는게 현재 목표이자, 이 팩키지를 시작하게된 진짜 목적이다. (1번 문제 혹은 코드 하이라이팅에 관한 훨씬 편한 해결책을 알고 계신 분은 언제든지 의견주세요.)

R4Tistory 설치

R4Tistory는 현재 필자의 github에 올려져있기 때문에 devtools를 이용하여 설치를 하면 된다. 또한 패키지가 결국 rmarkdown을 살짝 변형한 것이기 때문에 rmarkdown팩키지 역시 없다면 설치하도록 하자.

install.packages("devtools")
install.packages("rmarkdown")
devtools::install_github("issactoast/R4Tistory")

만약 devtoolsrmarkdown이 설치되어 있다면, 마지막 명령어를 실행하면 팩키지가 설치될 것이다.

사용법

knitr4blog 함수는 티스토리에서 R코드 하이라이팅을 위한 Rmd 파일을 세팅한 후, 설정된 세팅에 맞게 knitting을 해주는 기능을 가지고 있다. 이 함수를 사용하는 방법은 다음의 4단계를 거치면 된다.

  1. 블로그에 올릴 Rmd 파일을 준비한다. 단, 파일의 이름에는 공백이 없어야 하고, 혹은 공백 대신 밑줄(_)을 사용하자. 예: your_file.Rmd

  2. Rmd 파일의 헤더는 다음과 같이 설정해준다. 이것은 knitr을 한 후의 결과 html을 최대한 서식이 없는 파일이 되도록 하기 위함이다. 자세한 사항은 관련 포스팅을 참고하자.

title: "제목"
output:
  html_document:
    self_contained: TRUE
    keep_md: FALSE
    theme: NULL
    highlight: NULL
  1. 파일이 위치한 폴더를 워킹 디렉토리로 설정 한 뒤(혹은 파일 주소를 통하여), 다음의 명령어를 사용해서 Rmd파일을 knitting 해준다.
library(R4Tistory)
knitr4blog("yourfile.Rmd")
  1. 결과물로 나온 파일을 브라우져에서 열기-> 소스코드 보기를 통하여 보여기는 html 소스 코드를 복사하여 자신의 티스토리 블로그에 html로 작성하기를 글쓰기 란에 그대로 붙여 넣으면 된다. 문단 간격없음을 체크 해제하면 훨씬 보기 좋다.(이 마지막 4단계는 추후 함수를 통하여 자동화 하려고 합니다.)

소스코드 설명

R4Tistory 패키지는 knitr4blog()change_codeclass() 함수 두 가지로 구성되어 있다. (시작은 미약하나 그 끝은 창대하리라.)

knitr4blog() 함수의 경우는 rmarkdown 패키지의 render()함수를 불러와 knitting을 해준 후, 결과물인 html파일을 change_codeclass() 함수에 넣어주는 역할을 한다. 단, 파일 이름에 공백이 있을 경우 knitr에서 공백을 밑줄로 바꿔버려서 그냥 공백 허용을 하지 않도록 이름 체크 기능을 넣었다.

knitr4blog <- function(fileName, className = "language-r"){
  if (length(grep(" ", fileName)) != 0) {
    warning("your fileName has blank, please use '_' instead of the blank. ex: 'file_name.Rmd'")
    return(NA)
  } else {
    render(fileName)
    change_codeclass(paste0(gsub(".Rmd","", fileName),".html"),
                     className)
  }
}

change_codeclass() 함수가 하는 일은 주어진 html파일은 읽어온 후 pre class = "r" 부분을 찾아 원하는 클래스 이름으로 바꿔 줄 뿐이다.

change_codeclass <- function(fileName, className){
  myweb <- readLines(fileName)
  myweb <- gsub("pre class=\"r\"",
                paste0("pre class=\"", className,"\""),
                myweb)
  myweb <- paste(as.character(myweb), collapse = "\n")
  write.table(myweb,
              file = fileName,
              quote = FALSE,
              col.names = FALSE,
              row.names = FALSE)
}
SHARE TO