• 들어가기
  • R 패키지의 구성
    • 패키지 구성 파일
    • 파일이름 명명규칙
  • 한글 R 패키지
    • 한글 R 패키지 정의
    • 한글 R 패키지 개발 이슈
  • 패키지 빌드시 발생하는 문제
    • 파일 이름에 한글이 포함된 경우
    • 한글이 포함된 파일

들어가기

Draft입니다. 업데이트하여 완전한 솔루션을 완성하겠습니다.

들어가기

R 패키지는 영문으로 개발하는 것을 표준으로 한다. 그러므로 한글을 포함한 non-ASCII 문자로 패키지를 구성할 때에는 몇몇 오류와 만난다. 특히 CRAN에 등록할 R 패키지는 엄격한 심사를 거쳐야하기 때문에 어느 정도의 한글을 포기하는 타협과 심사에서 살아남기 위한 회피가 필요하다.
한글이 포함된 패키지 개발을 여러 사람이 협업할 기회가 있었는데, MacOS에서 정상적으로 동작하여 공유된 것이 MS-Windows 사용자 환경에서 오류가 발생하였다.

R 패키지의 구성

패키지 구성 파일

패키지의 기본적인 정보를 담고 있는 메타 파일로 패키지의 버전, 저자, 종속성 등이 담겨 있다. CRAN의 R 패키지 페이지에서는 패키지의 여러 정보를 제공하는데, 대부분이 DESCRIPTION의 정보로 표현한다.

개발하는 패키지가 참조하는 다른 패키지의 객체(함수나 메소드 등), 개발하는 패키지가 제공하는 객체를 네임스페이스에 등록하기 위한 정보를 담는다.

R 디렉토리에 프로그램 소스 파일을 담는다. *.R 형식으로 이름을 정의한다.

man 디렉토리에 데이터나 함수, 메소드에 대한 도움말 파일을 담는다. *.Rd 형식으로 이름을 정의한다.

vignettes 디렉토리에 도움말 보다 좀 더 친절한 패키지 사용 방법을 소개하는 소품 파일을 담는다. R 마크다운 편집 파일로 *.Rmd 형식으로 이름을 정의한다.

data 디렉토리에 R 데이터 파일을 담는다. R 데이터 파일로 *.rda 형식으로 이름을 정의한다.

inst 디렉토리에 패키지를 구성하는 표준 파일이 아니지만 패키지에 제공할 파일을 넣을 수 있다.

파일이름 명명규칙

DESCRIPTION, NAMESPACE 파일 이름은 변경이 불가능하다. 소스파일과 소품 파일은 이름으로도 그 기능을 유추할 수 있도록 간결하면서 명확한 이름을 만들어야 한다. 도움말 파일의 이름을 도움말을 제공하는 함수 혹은 메소드, 데이터 이름으로 정한다.

파일 이름은 절대로 non-ASCII 문자를 포함하면 안된다.

한글 R 패키지

한글 R 패키지 정의

“한글 R 패키지는 패키지를 구성하는 여러 파일, 도움말, 소품 등을 한글로 표현하여, 내국인의 사용성을 제고하기 위한 패키지다.”

한글 R 패키지 개발 이슈

한글 인코딩 이슈

한글 인코딩은 Linux, MacOS, MS-Windows별로 상이하기 때문에 크로스 플랫폼으로 개발하는 데 이슈가 발생한다. 물론 영문과 같은 ASCII 문자의 경우에는 호환성의 이슈가 없다.

Linux, MacOS는 Unix-like 운영체제로 인코딩UTF-8을 사용하기에 호환성에는 큰 문제는 없다. 그러나 MS-Windows는 CP949을 사용하기 때문에 문제가 발생한다. Linux, MacOS에서 정상적으로 동작하는 것이 MS-Windows에서는 오류가 발생할 수 있는 것이다. 그러므로 MS-Windows에서는 파일을 저장할 때 인코딩을 반드시 UTF-8로 설정해야 한다.

맥 파일 이름의 이슈

MacOS에서 만든 한글이 포함된 파일 이름은 MS-Windows 환경에서는 자음과 모음이 분리되는 현상이 발생한다. 예를 들어 한글.txtㅎㅏㄴㄱㅡ ㄹ.txt로 표현된다. 이 현상이 발생하는 원인은 MacOS와 MS-Windows가 유니코드 문자를 조합하는 정규화 방법의 차이에 기인한다.

아마 간혹 지인이나 업무상 메일에 첨부된 한글 파일의 이름이 예처럼 깨져서(?) 보이는 경험을 한 적이 있을 것이다. 이 경우에는 십중팔구 보내는 쪽에서 한글이름이 포함된 파일을 MacOS에서 만든 경우고, 당신은 MS-Windows에서 해당 파일을 접한 것이다.

구글링 하면 몇 가지 해결 방법이 이 이슈는 고질적인 이슈라 구글링하면 다음처럼 여러 솔루션이 나온다.

  • 클라우드 서비스의 이용
    • MS Onedrive / Dropbox를 이용하여 문제 해결
    • 다만, iCloud / Google Drive는 해결 안됨
  • 파일을 압축하는 방법
    • 몇몇 MacOS용 파일 압축 프로그램이 자음과 모음이 분리되는 현상을 해결해 줌
    • WinArchiver, Keka 등
  • 파일 이름을 수정하는 방법
    • 자모가 분리되도 원 한글이 유추되므로
    • 파일을 전달받은 MS-Windows 사용자가 정상적인 한글로 파일 이름 바꾸기
      • 파일의 개수가 많으면, 보낸 사람은 뒷담화에 귀가 간지러울 수 있음
  • MacOS의 터미널에서 convmv 사용
    • convmv -f utf8 -t utf8 –nfc –notest
    • brew install convmv로 설치

솔루션

MacOS에서 만든 한글이 포함된 파일은 convmv를 이용하여 MS-Windows에서 자음과 모음이 분리되는 현상을 방지하는 것을 추천한다. 그 이유는 파일이 가지고 있는 원천적인 문제를 해결하는 방법이기 때문이다. 하지만 터미널 명령어 사용이 어렵다면 알려진 다른 방법을 사용하면 된다.

파일이름 명명규칙 이슈

파일 이름은 절대로 non-ASCII 문자를 포함하면 안된다. 그러므로 파일 이름에 한글을 넣을 수 없다.

inst 디렉토리에 패키지를 구성하는 표준 패키지 파일이 아니지만 패키지에 제공할 파일을 넣을 수 있다.

패키지 빌드시 발생하는 문제

파일 이름에 한글이 포함된 경우

소스파일과 도움말 파일, 소품 파일의 이름을 굳이 한글로 정할 필요는 없다. 그러나 경우에 따라서 표준 패키지 파일이 아닌 경우에 한글로 이름을 정할 수도 있다.

실습을 위한 데이터 파일로 *.CSV을 제공하고, 그 이름에 한글이 포함된 경우가 있었다.

솔루션

파일 이름에서 한글을 제거하는 수 밖에 없다. 그리고 반드시 필요하다면, 일단 영문명으로 제공라고 R 프로그램 로직으로 해결하라.
  • 대안 1
    • 영문 이름으로 파일을 만든 다음, 사용하기 전에 한글 파일명으로 변경하는 방법
  • 대안 2
    • 유효한(한글이 미포함) 이름으로 압축한 후, 사용하기 전에 압축을 해제하는 방법
  • 대안 3
    • 데이터를 R 객체로 저장한 다음, 사용 시 한글 이름의 CSV 파일로 export
    • CSV 파일일 경우의 대안

다음은 대안 2에 대한 예제 소스로, get_rawdata() 함수를 정의한 것이다. 한글이 포함된 파일은 유효한 파일 이름으로 압축 후, 필요할 때, 압축 해제하는 사례다.

#' 소스 데이터 파일 가져오기
#'
#' 초중등 통계 데이터셋을 만든 데이터 파일을 가져온다.
#' 메뉴에서 해당 파일 이름을 선택하면, 지정한 경로에 파일이 복사된다.
#'
#' @param dest_dir character. 파일을 가져올 디렉토리 경로.
#' 기본값은 "."으로 현재 디렉토리
#' @export get_rawdata
#'
#' @aliases 데이터파일가져오기
#' @examples
#' \dontrun{
#' # `inst/extdata` 디렉토리 경로에 데이터 파일을 복사한다.
#' get_rawdata()
#'
#' # c:/temp에 선택한 데이터 파일을 복사한다.
#' get_rawdata("c:/temp")
#' }
#'
#' @importFrom utils menu unzip
get_rawdata <- function(dest_dir = "inst/extdata") {
    pkg_resource = function(...) {
        system.file(..., package = "statdata")
    }

    zip_name <- pkg_resource("extdata/rawdata.zip")

    # fname <- c("초등과학3-2그림자길이(136쪽).csv",
    #            "초등과학3-2우리나라해역오염실태자료(104쪽).csv",
    #            "전체 파일",
    #            "취소하기")

    fname <- c("\ucde8\uc18c\ud558\uae30",
               "\uc804\uccb4 \ud30c\uc77c",
               "\ucd08\ub4f1\uacfc\ud5593-2\uadf8\ub9bc\uc790\uae38\uc774(136\ucabd).csv",
               "\ucd08\ub4f1\uacfc\ud5593-2\uc6b0\ub9ac\ub098\ub77c\ud574\uc5ed\uc624\uc5fc\uc2e4\ud0dc\uc790\ub8cc(104\ucabd).csv",
               "\ucd08\ub4f1\uacfc\ud5595-2\uac01\ud589\uc131\uc758\ubc18\uc9c0\ub984(141\ucabd).csv",
               "025\uc6d0\uc2dc_\uc131\ubcc4.csv")

    # stringi::stri_escape_unicode("가져올 데이터 파일 선택하기")
    index_choiced <- utils::menu(fname, graphics = FALSE,
                                 title = "\uac00\uc838\uc62c \ub370\uc774\ud130 \ud30c\uc77c \uc120\ud0dd\ud558\uae30")

    if (index_choiced == 1)
        return()

    if (index_choiced == 2) {
        utils::unzip(zip_name, exdir = dest_dir)
    } else {
        utils::unzip(zip_name, files = fname[index_choiced], exdir = dest_dir)
    }
}

한글이 포함된 파일

패키지 빌드 시 발생하는 한글 문제는 대부분 MS-Windows 환경에서 발생한다. 그러므로 MacOS와 Linux에서 정상적으로 빌드되었다고 안심해서는 안된다. MS-Windows 환경에서의 이상 여부를 반드시 확인해야 한다.

DESCRIPTION

DESCRIPTION 파일에는 패키지 타이틀이나 패키지의 기능을 설명하는 태그가 있다. 친절하게 패키지를 소개하기 위해서 한글로 타이틀과 패키지를 소개하고 싶을 것이다. 그러나 이 경우에는 패키지를 빌드할 때 오류가 발생한다.

솔루션

DESCRIPTION은 CRAN에 등록된 패키지를 설명하는 정보를 담고 있는 규약이 있으며, non-ASCII 문자로 구성해야 한다. 아쉽더라도 DESCRIPTION은 영문으로 기술하자. 즉, 한글화 대상에서 제외한다.

소스코드 파일

소스 코드를 기술한 R/*.R 파일의 소스 스크립트에 한글을 포함할 경우, 패키지 빌드시 오류가 발생한다.

솔루션

한글을 유니코드로 바꾸어서 R 스크립트를 개발한다. 예를 들어 '한글'은 유니코드인 '\ud55c\uae00'로 기술한다.

get_rawdata() 함수를 정의한 앞의 소스에 솔루션이 포함되어 있다. 한글은 stringi::stri_escape_unicode()를 이용해서 유니코드로 변경할 수 있다. 다만 stringi::stri_escape_unicode()에서는 이스케이프문자인 역 슬래시(“\”)가 두개로 출력되는데 하나를 지우고 입력한다.

stringi::stri_escape_unicode(c("한글을 사랑합니다.", "그러나 R과 궁합이 안 맞네요."))
#> [1] "\\ud55c\\uae00\\uc744 \\uc0ac\\ub791\\ud569\\ub2c8\\ub2e4."                         
#> [2] "\\uadf8\\ub7ec\\ub098 R\\uacfc \\uad81\\ud569\\uc774 \\uc548 \\ub9de\\ub124\\uc694."
stringi::stri_escape_unicode(c("한글", "사랑", "홍길동"))
#> [1] "\\ud55c\\uae00"        "\\uc0ac\\ub791"        "\\ud64d\\uae38\\ub3d9"

소품(vignettes) 파일

vignette 파일 본문에 한글을 포함할 경우 빌드시 오류 발생한다.

솔루션

한글 vignette 내용을 외부 홈페이지에 만들어 놓은 후 vignette에서 해당 URL 링크
 

Created by bitR