부록 B: R 실행하기
부록 B: R 실행하기 (Invoking R)
R을 처음 설치하고 나면 가장 먼저 하는 일이 "어떻게 실행하지?"라는 고민이죠. 이번 장에서는 명령 줄에서 R을 시작하는 방법, 그리고 Windows와 macOS에서 각각 R을 어떻게 띄우는지, 나아가 R 코드를 스크립트로 만들어 자동 실행하는 방법까지 차근차근 다뤄볼게요. Windows나 macOS 사용자라면 자기 운영체제에 해당하는 절을 먼저 읽어 주세요. 다만 명령 줄 사용법은 어떤 운영체제에서든 동일하게 쓰이니 기본으로 알아두면 좋아요.
출처: R 공식 매뉴얼
본문
B.1 명령 줄에서 R 실행하기
UNIX나 Windows의 명령 줄에서 작업할 때, R이라는 명령은 크게 두 가지 용도로 쓰여요. 하나는 R 본체 프로그램을 아래 형태로 시작하는 것이고,
R [options] [< infile] [> outfile],
다른 하나는 R CMD 인터페이스를 통해 각종 R 도구의 래퍼(wrapper) 역할을 하는 거예요. 이 도구들은 예를 들어 R 문서 형식의 파일을 처리하거나 부가 패키지(add-on packages)를 다루는 것들인데, "직접" 호출하기보다 R CMD를 거쳐 쓰도록 설계된 것들이에요.
Windows 명령 줄에서는 R보다 Rterm.exe를 쓰는 편이 더 좋아요.
임시 파일과 디렉터리를 만들려면 TMPDIR 환경 변수가 설정되어 있지 않거나, 설정되어 있다면 유효한 위치를 가리키고 있어야 해요.
대부분의 옵션은 R 세션이 시작되는 시점과 끝나는 시점에 어떤 일이 일어날지를 제어해요. R의 시작(시동) 과정은 다음과 같이 진행돼요. (Startup 주제에 대한 온라인 도움말도 함께 참고하고, 아래에는 Windows와 관련된 몇 가지 세부 사항도 들어 있어요.)
--no-environ이 주어지지 않았다면, R은 환경 변수를 설정하기 위해 처리할 사용자 파일과 사이트 파일을 찾아요. 사이트 파일의 이름은R_ENVIRON환경 변수가 가리키는 파일이고, 이 변수가 설정되지 않았다면R_HOME/etc/Renviron.site를 사용해요(있을 경우). 사용자 파일은R_ENVIRON_USER환경 변수가 설정되어 있으면 그 변수가 가리키는 파일이고, 그렇지 않으면 현재 디렉터리나 사용자 홈 디렉터리에서.Renviron파일을 순서대로 찾아요. 이 파일들은name = value형태의 줄을 담고 있어야 해요. 정확한 설명은help("Startup")을 참고하세요. 설정하고 싶을 만한 변수로는R_PAPERSIZE(기본 용지 크기),R_PRINTCMD(기본 인쇄 명령),R_LIBS(부가 패키지를 찾기 위해 검색할 R 라이브러리 트리 목록) 등이 있어요.- 그다음,
--no-site-file옵션이 주어지지 않았다면 R은 사이트 전체 시동 프로파일(site-wide startup profile)을 찾아요. 이 파일의 이름은R_PROFILE환경 변수 값에서 가져오고, 변수가 설정되지 않았다면 기본값인R_HOME/etc/Rprofile.site(존재할 경우)를 사용해요. - 이어서
--no-init-file이 주어지지 않았다면 R은 사용자 프로파일을 찾아 source 해요. 파일 이름은R_PROFILE_USER환경 변수에서 가져오고, 설정되지 않았다면 현재 디렉터리나 사용자 홈 디렉터리에서.Rprofile파일을 순서대로 찾아요. - 또 현재 디렉터리에
.RData파일이 있으면 그 저장된 워크스페이스(작업공간)를 불러와요(단,--no-restore나--no-restore-data를 지정한 경우는 제외). - 마지막으로
First()함수가 존재하면 그 함수를 실행해요. 이 함수(그리고 R 세션이 끝날 때 실행되는Last()함수도 마찬가지)는 적절한 시동 프로파일에서 정의하거나.RData에 담아 둘 수 있어요.
추가로 R 프로세스가 사용할 수 있는 메모리를 제어하는 옵션도 있어요(Memory 주제에 대한 온라인 도움말 참고). 보통 사용자는 R이 쓰는 메모리 양을 제한하려 할 때가 아니라면 이런 옵션을 쓸 일이 거의 없어요.
R이 받아들이는 명령 줄 옵션들은 다음과 같아요.
--help,-h— 표준 출력에 짧은 도움말 메시지를 출력하고 성공적으로 종료해요.--version— 표준 출력에 버전 정보를 출력하고 성공적으로 종료해요.--encoding=enc— 콘솔이나stdin에서 입력을 받을 때 가정할 인코딩을 지정해요. 이 인코딩은 iconv가 아는 인코딩이어야 해요(iconv의 도움말 페이지 참고).--encoding enc형태도 받아들여요. 입력은 R이 실행 중인 로케일로 다시 인코딩되는데, 그 로케일의 인코딩으로 표현 가능해야 해요(예를 들어 프랑스어 로케일이 UTF-8을 쓰지 않으면 그리스어 텍스트를 다시 인코딩할 수 없어요).RHOME— R의 "홈 디렉터리" 경로를 표준 출력으로 출력하고 성공적으로 종료해요. 프런트엔드 셸 스크립트와 man 페이지를 제외하고, R 설치에 포함된 모든 것(실행 파일, 패키지 등)이 이 디렉터리에 들어 있어요.--save,--no-save— R 세션이 끝날 때 데이터 세트를 저장할지 말지를 제어해요. 대화형 세션에서 둘 다 주어지지 않으면 사용자가q()로 세션을 끝낼 때 원하는 동작을 물어봐요. 비대화형(non-interactive) 사용에서는 둘 중 하나를 지정하거나 다른 옵션으로 암시해야 해요(아래 참고).--no-environ— 환경 변수를 설정하기 위한 사용자 파일을 아무것도 읽지 않아요.--no-site-file— 시작 시 사이트 전체 프로파일을 읽지 않아요.--no-init-file— 시작 시 사용자 프로파일을 읽지 않아요.--restore,--no-restore,--no-restore-data— 시작 시 저장된 이미지( R이 시작된 디렉터리의.RData파일)를 복원할지 말지를 제어해요. 기본값은 복원하는 것이에요. (--no-restore는 구체적인--no-restore-*옵션들을 모두 포함해요.)--no-restore-history— 시작 시 히스토리 파일(보통 R이 시작된 디렉터리의.Rhistory파일이며,R_HISTFILE환경 변수로 바꿀 수 있음)을 복원할지 말지를 제어해요. 기본값은 복원하는 것이에요.--no-Rconsole— (Windows 전용) 시작 시 Rconsole 파일을 불러오지 않아요.--vanilla—--no-save,--no-environ,--no-site-file,--no-init-file,--no-restore를 모두 합친 옵션이에요. Windows에서는 여기에--no-Rconsole도 포함돼요.-f file,--file=file— (Rgui.exe에서는 불가)file에서 입력을 받아요.-는stdin을 의미해요.--save가 설정되지 않았다면--no-save를 암시해요. Unix 계열에서는file에 셸 메타문자를 쓰지 않는 게 좋아요(공백은 허용돼요).-e expression— (Rgui.exe에서는 불가)expression을 입력 줄로 사용해요.-e옵션은 하나 이상 사용할 수 있지만-f나--file과 함께는 쓸 수 없어요.--save가 설정되지 않았다면--no-save를 암시해요. (이렇게 사용되는 표현식의 총 길이는 10,000바이트로 제한돼요. 공백이나 셸 메타문자가 있는 표현식은 따옴표로 감싸야 해요.)--no-readline— (UNIX 전용) readline을 통한 명령 줄 편집을 꺼요. ESS("Emacs Speaks Statistics") 패키지를 써서 Emacs 안에서 R을 실행할 때 유용해요. 자세한 내용은 The command-line editor 장을 참고하세요. 명령 줄 편집은 기본적인 대화형 사용에서는 켜져 있어요(--interactive참고). 이 옵션은 틸드 확장(tilde-expansion)에도 영향을 주니path.expand도움말을 참고하세요.--min-vsize=N,--min-nsize=N— 전문가용 옵션으로, 벡터 힙(바이트 단위)과 cons 셀(개수 단위)의 가비지 컬렉션 초기 트리거 크기를 각각 설정해요. 접미사M은 각각 메가바이트나 백만 셀을 뜻해요. 기본값은 각각 6Mb와 350k이며,R_NSIZE와R_VSIZE환경 변수로도 설정할 수 있어요.--max-ppsize=N— 포인터 보호 스택(pointer protection stack)의 최대 크기를 N개의 위치로 지정해요. 기본값은 10000이지만, 크고 복잡한 계산을 하기 위해 늘릴 수 있어요. 현재 받아들여지는 최대값은 100000이에요.--quiet,--silent,-q— 시작 시 저작권과 환영 메시지를 출력하지 않아요. 또한options("quiet")(즉getOption("quiet"))를TRUE로 설정해, 다른 R 함수들이 평소보다 조용히 동작하도록 해요.--no-echo,-s— R을 최대한 조용히 실행해요. R이 결과를 계산해 주는 프로그램을 지원하기 위한 옵션이에요.--quiet와--no-save를 암시해요.--interactive— (UNIX 전용) 입력이 리다이렉트되었더라도 R이 실제로 대화형으로 실행되고 있음을 명시해요. 입력이 FIFO나 파이프에서 오고 그것이 대화형 프로그램에서 공급될 때 사용해요. (기본적으로는 stdin이 터미널이나 pty에 연결되어 있을 때만 R이 대화형으로 실행된다고 판단해요.)-e,-f,--file을 쓰면--interactive가 주어져도 비대화형으로 간주해요. 이 옵션이 명령 줄 편집을 켜지는 않는다는 점도 유의하세요.--ess— (Windows 전용) ESS의 R-inferior-mode에서 쓰도록 Rterm을 설정해요. 대화형 사용을 명시하고(명령 줄 편집기는 제외) stdout 버퍼링을 끕니다.--verbose— 진행 상황에 대한 정보를 더 많이 출력하고, 특히 R의 옵션verbose를TRUE로 설정해요. R 코드는 이 옵션으로 진단 메시지 출력을 제어해요.--debugger=name,-d name— (UNIX 전용)name이라는 디버거를 통해 R을 실행해요. 대부분의 디버거(valgrind와 최신 gdb는 예외)에서는 추가 명령 줄 옵션이 무시되므로, 디버거 안에서 R 실행 파일을 시작할 때 옵션을 주어야 해요.--gui=type,-g type— (UNIX 전용)type을 그래픽 사용자 인터페이스로 사용해요(인터랙티브 그래픽도 포함). 현재 가능한type값은X11(기본값)과,Tcl/Tk지원이 가능할 때Tk예요. (하위 호환을 위해x11,tk도 받아들여요.)--arch=name— (UNIX 전용) 지정된 하위 아키텍처(sub-architecture)로 실행해요.--args— 이 플래그 자체는 아무것도 하지 않고 명령 줄의 나머지를 건너뛰게 해요.commandArgs(TRUE)로 그 값들을 가져올 때 유용해요.
입력과 출력은 평소처럼(<와 >를 써서) 리다이렉트할 수 있지만, 줄 길이 제한인 4095바이트는 여전히 적용돼요. 경고와 오류 메시지는 오류 채널(stderr)로 보내져요.
R CMD 명령은 R과 함께 쓰면 유용하지만 "직접" 호출하도록 설계되지 않은 여러 도구를 실행해 줘요. 일반적인 형태는 이래요.
R CMD command args
여기서 command는 도구의 이름이고, args는 그 도구에 넘겨지는 인자예요.
현재 사용 가능한 도구는 다음과 같아요.
BATCH— 배치 모드로 R을 실행해요. 필요한 옵션을 붙여R --restore --save를 실행해요(?BATCH참고).COMPILE— (UNIX 전용) R에서 쓰도록 C, C++, Fortran… 파일을 컴파일해요.SHLIB— 동적 로딩을 위한 공유 라이브러리를 빌드해요.INSTALL— 부가 패키지를 설치해요.REMOVE— 부가 패키지를 제거해요.build— 부가 패키지를 빌드(즉 패키징)해요.check— 부가 패키지를 검사해요.LINK— (UNIX 전용) 실행 프로그램을 만드는 프런트엔드예요.Rprof— R 프로파일링 파일을 후처리해요.Rdconv,Rd2txt— Rd 형식을 HTML, LaTeX, 일반 텍스트 등 여러 형식으로 변환하고 예제를 추출해요.Rd2txt는Rd2conv -t txt의 줄임말로 쓸 수 있어요.Rd2pdf— Rd 형식을 PDF로 변환해요.Stangle— Sweave나 다른 비네트(vignette) 문서에서 S/R 코드를 추출해요.Sweave— Sweave나 다른 비네트 문서를 처리해요.Rdiff— 헤더 등을 무시하고 R 출력을 diff 해요.config— 설정 정보를 얻어요.javareconf— (Unix 전용) Java 설정 변수를 갱신해요.rtags— (Unix 전용) C, R, Rd 파일에서 Emacs 스타일 태그 파일을 만들어요.open— (Windows 전용) Windows의 파일 연결(file association)을 통해 파일을 열어요.texify— (Windows 전용) R의 스타일 파일로 (La)TeX 파일을 처리해요.
R CMD 인터페이스로 접근할 수 있는 각 도구의 사용 정보를 보려면,
R CMD command --help
를 쓰면 돼요.
추가로, R과 CMD 사이에 --arch=, --no-environ, --no-init-file, --no-site-file, --vanilla 옵션을 둘 수 있어요. 이 옵션들은 그 도구들이 실행하는 R 프로세스에 영향을 줘요. (여기서 --vanilla는 --no-environ --no-site-file --no-init-file과 같아요.) 다만 R CMD 자체는 어떤 R 시동 파일도 사용하지 않아요(특히 사용자나 사이트의 Renviron 파일 둘 다 사용하지 않아요). 이 도구들이 실행하는 R 프로세스는 모두(BATCH 제외) --no-restore를 사용해요. 대부분은 --vanilla를 사용하므로 R 시동 파일을 전혀 실행하지 않는데요, 현재 예외는 INSTALL, REMOVE, Sweave, SHLIB(이것은 --no-site-file --no-init-file을 사용)예요.
path에 있는 다른 실행 파일이나 절대 파일 경로로 주어진 실행 파일도 아래처럼 실행할 수 있어요.
R CMD cmd args
이렇게 하면 R과 같은 환경에서 특정 명령을 실행할 수 있어서 유용해요. 예를 들어 ldd나 pdflatex를 실행할 때 쓰죠. Windows에서 cmd는 실행 파일이나 배치 파일일 수 있고, 확장자가 .sh나 .pl이면 적절한 인터프리터(가능할 때)가 호출돼요.
B.2 Windows에서 R 실행하기
Windows에서 R을 실행하는 방법은 두 가지가 있어요. 터미널 창(예: cmd.exe나 더 기능이 좋은 셸) 안에서는 앞 절에서 설명한 방법을 쓰면 되는데, R.exe로 호출하거나 더 직접적으로 Rterm.exe로 호출해요. 대화형으로 쓰려면 콘솔 기반 GUI인 Rgui.exe가 있어요.
Windows의 시동 절차는 UNIX와 매우 비슷하지만, "홈 디렉터리"가 무엇을 가리키는지 명확히 해 둘 필요가 있어요. Windows에서는 홈 디렉터리가 항상 정의되어 있지는 않거든요. 먼저 R_USER 환경 변수가 정의되어 있으면 그것이 홈 디렉터리예요. 다음으로 HOME 환경 변수가 정의되어 있으면 그것이 홈 디렉터리예요. 이 두 가지 사용자가 정할 수 있는 설정 다음에, R은 시스템이 정의한 홈 디렉터리를 찾아요. 먼저 Windows의 "personal" 디렉터리(최신 Windows에서는 보통 My Documents)를 사용하려 시도해요. 그것이 실패하고 HOMEDRIVE와 HOMEPATH 환경 변수가 정의되어 있으면(보통 정의되어 있어요) 그 변수들이 홈 디렉터리를 정의해요. 이 모든 것이 실패하면 시작 디렉터리를 홈 디렉터리로 삼아요.
TMPDIR, TMP, TEMP 환경 변수는 모두 설정되어 있지 않거나, 그중 하나가 임시 파일과 디렉터리를 만들 유효한 위치를 가리켜야 해요.
환경 변수는 명령 줄에서 name = value 쌍으로 제공할 수 있어요.
RData로 끝나는 인자가 있으면(어떤 경우든) 그것은 복원할 워크스페이스의 경로로 해석돼요. 이 경우 --restore를 암시하고 작업 디렉터리를 해당 파일의 부모 디렉터리로 설정해요. (이 메커니즘은 RGui.exe의 드래그앤드롭과 파일 연결에서 쓰이지만, Rterm.exe에서도 동작해요. 지정된 파일이 없으면 부모 디렉터리가 존재하는 경우 작업 디렉터리를 그 부모로 설정해요.)
RGui.exe를 호출할 때 다음과 같은 추가 명령 줄 옵션을 사용할 수 있어요.
--mdi,--sdi,--no-mdi— Rgui가 MDI 프로그램(하나의 주 창 안에 여러 자식 창)으로 동작할지, SDI 응용 프로그램(콘솔·그래픽·페이지에 여러 최상위 창)으로 동작할지를 제어해요. 명령 줄 설정이 사용자의 Rconsole 파일 설정보다 우선해요.--debug— Rgui에서 "Break to debugger" 메뉴 항목을 활성화하고, 명령 줄 처리 중 디버거로 중단을 유발해요.
Windows에서 R CMD로 자신만의 .bat, .exe, .sh, .pl 파일을 지정할 수도 있어요. 이 파일은 적절한 인터프리터(.pl은 Perl)로 실행되는데, R_HOME, R_OSTYPE, PATH, BSTINPUTS, TEXINPUTS 등 여러 환경 변수가 적절히 설정돼요. 예를 들어 이미 path에 latex.exe가 있다면,
R CMD latex.exe mydoc
라고 하면 R의 share/texmf 매크로 경로를 TEXINPUTS에 덧붙여 mydoc.tex에 LaTeX을 실행해요. (MiKTeX 빌드의 LaTeX이라면 R CMD texify mydoc을 쓰는 게 더 편할 때가 많아요.)
B.3 macOS에서 R 실행하기
macOS에서 R을 실행하는 방법도 두 가지가 있어요. Terminal.app 창 안에서 R을 호출하면 첫 번째 하위 절에서 설명한 방법이 그대로 적용돼요. 또한 콘솔 기반 GUI인 R.app이 있는데, 기본적으로 시스템의 Applications 폴더에 설치돼요. 이것은 표준적인 더블클릭으로 실행하는 macOS 응용 프로그램이에요.
macOS의 시동 절차는 UNIX와 매우 비슷하지만, R.app은 명령 줄 인자를 사용하지 않아요. "홈 디렉터리"는 R.framework 안에 있지만, 시동 및 현재 작업 디렉터리는 GUI에서 접근할 수 있는 Preferences 창에서 다른 시동 디렉터리를 주지 않는 한 사용자 홈 디렉터리로 설정돼요.
B.4 R 스크립트 작성하기 (Scripting with R)
R 명령이 담긴 foo.R 파일 하나만 실행하고 싶다면, 권장하는 방법은 R CMD BATCH foo.R을 쓰는 거예요. 백그라운드나 배치 작업으로 실행하려면 운영체제별 기능을 사용해요. 예를 들어 UNIX 계열 OS의 대부분의 셸에서 R CMD BATCH foo.R &는 백그라운드 작업으로 실행해요.
명령 줄의 추가 인자를 통해 스크립트에 매개변수를 넘길 수 있어요. 예를 들어 (정확한 따옴표는 사용 중인 셸에 따라 달라요)
R CMD BATCH "--args arg1 arg2" foo.R &
라고 하면 스크립트에 인자가 전달되는데, 그 인자는 아래처럼 문자 벡터로 받아올 수 있어요.
args <- commandArgs(TRUE)
이런 작업은 대안 프런트엔드인 Rscript로 더 간단해져요. 아래처럼 호출할 수 있죠.
Rscript foo.R arg1 arg2
그리고 Rscript는 아래처럼 실행 가능한 스크립트 파일을 만드는 데도 쓸 수 있어요(적어도 UNIX 계열에서는, 그리고 몇몇 Windows 셸에서도).
#! /path/to/Rscript
args <- commandArgs(TRUE)
...
q(status=<exit status code>)
이 내용을 runfoo라는 텍스트 파일에 넣고 chmod 755 runfoo로 실행 권한을 주면, 다양한 인자로 아래처럼 호출할 수 있어요.
runfoo arg1 arg2
더 자세한 옵션은 help("Rscript")를 참고하세요. Rscript는 R 출력을 stdout과 stderr로 보내는데, 평소처럼 셸에서 리다이렉트할 수 있어요.
Rscript의 절대 경로를 하드코딩하고 싶지 않고 path에 넣어 두고 싶다면(설치된 R에서는 보통 그렇지만 Windows에서는 예외이고, 예를 들어 macOS 사용자는 /usr/local/bin을 path에 추가해야 할 수 있어요),
#! /usr/bin/env Rscript
...
를 쓰면 돼요.
적어도 Bourne 셸과 bash 셸에서는 #! 메커니즘이 #! /usr/bin/env Rscript --vanilla 같은 추가 인자를 허용하지 않아요.
한 가지 생각해 볼 점은 stdin()이 무엇을 가리키는지예요. R 스크립트에는 아래와 같은 부분을 넣는 게 흔해요.
chem <- scan(n=24)
2.90 3.10 3.40 3.40 3.70 3.70 2.80 2.50 2.40 2.40 2.70 2.20
5.28 3.37 3.03 3.03 28.95 3.77 3.40 2.20 3.50 3.60 3.70 3.70
이런 전통적인 사용을 가능하게 하려고 stdin()이 스크립트 파일을 가리켜요. 프로세스의 stdin을 가리키고 싶다면 "stdin"을 파일 연결로 사용하면 돼요. 예를 들어 scan("stdin", ...)처럼요.
(François Pinard가 제안한) 실행 가능한 스크립트 파일을 만드는 또 다른 방법은 heredoc을 쓰는 거예요.
#!/bin/sh
[environment variables can be set here]
R --no-echo [other options] <<EOF
R program goes here...
EOF
하지만 이 경우 stdin()은 프로그램 소스를 가리키므로 "stdin"은 사용할 수 없어요.
짧은 스크립트는 -e 플래그로 명령 줄에서 Rscript에 넘길 수 있어요. (빈 스크립트는 받아들여지지 않아요.)
UNIX 계열에서 입력 파일 이름(예: foo.R)에는 공백이나 셸 메타문자가 들어가면 안 된다는 점도 참고해 두세요.
더 알아보기
- R 공식 매뉴얼: An Introduction to R — 이 문서의 원문 전체를 볼 수 있어요.
- R을 시작할 때 어떤 파일들이 읽히는지, 환경 변수를 어떻게 설정하는지 궁금하다면 R 콘솔에서
help("Startup")을 실행해 보세요. Rscript의 다양한 옵션을 확인하려면help("Rscript")를 참고하세요.- 부록 C(The command-line editor)에서는 R 세션 안에서 명령 줄을 편집하는 방법을 다뤄요.