명령 줄 (터미널)에서 R 스크립트를 사용하는 가장 좋은 방법은 무엇입니까?


115

명령 줄에서 간단한 플롯을 수행하기위한 R 스크립트가 있으면 매우 편리합니다. 그러나 bash 스크립트에서 R을 실행하는 것은 전혀 편리하지 않습니다. 이상은 다음과 같을 수 있습니다.

#!/path/to/R
...

또는

#!/usr/bin/env R
...

그러나 나는 그 둘 중 하나를 만들 수 없었습니다.

또 다른 옵션은 스크립트를 순전히 R (예 :)로 유지하고 script.R이를 사용 R --file=script.R하거나 이와 유사하게 호출하는 것입니다 . 그러나 때때로 스크립트는 코드의 일부가 스크립트 외부에 존재하는 모호한 명령 줄 스위치에 의존합니다. 예 : 로컬 .Rprofile 통해 떠들썩한 파티에서 R로 물건을 몰래 원하는 스위치는 모두가 --vanilla제외 의미한다 --no-init-file.

또 다른 옵션은 R 플래그를 저장하고 쉽게 실행할 수있는 bash 스크립트입니다. 그런 다음 R 스크립트를 호출합니다. 문제는 단일 프로그램이 이제 동기화 상태를 유지해야하는 두 개의 파일로 분할되고 함께 새 시스템으로 전송된다는 것을 의미합니다.

내가 현재 가장 경멸하는 옵션은 bash 스크립트에 R을 포함하는 것입니다.

#!/bin/bash
... # usage message to catch bad input without invoking R
... # any bash pre-processing of input
... # etc
R --random-flags <<RSCRIPT
# R code goes here
RSCRIPT

모든 것이 단일 파일에 있습니다. 실행 가능하고 인수를 쉽게 처리합니다. 문제는 bash와 R을 이와 같이 결합하면 IDE가 둘 중 하나에서 실패하지 않을 가능성을 거의 제거하고 내 마음을 아프게 만든다는 것입니다.

내가 놓친 더 좋은 방법이 있습니까?

답변:


132

내용 script.r:

#!/usr/bin/env Rscript

args = commandArgs(trailingOnly = TRUE)
message(sprintf("Hello %s", args[1L]))

첫 번째 줄은 shebang 줄 입니다. /usr/bin/env RscriptR 설치 ​​경로를 하드 코딩하는 대신 사용하는 것이 가장 좋습니다 . 그렇지 않으면 다른 컴퓨터에서 스크립트가 손상 될 위험이 있습니다.

다음으로, 실행 가능하게 만드십시오 (명령 줄에서) :

chmod +x script.r

명령 줄에서 호출 :

./script.r world
# Hello world

1
예, 이것이 "공식적인"방법이라고 생각합니다.
Frank

5
그리고 Rscript --help명령 줄에서 실행 하면 셔뱅에 추가 할 수있는 많은 유용한 옵션이 나열됩니다 --vanilla.
flodel

8
또한 명령 줄 구문 분석을위한 commandArgs함수와 getoptoptparse패키지에 대해 언급하겠습니다 . 따라서 명령 줄에서 실행할 때 인수와 옵션을 스크립트에 전달할 수도 있습니다.
flodel

1
이것은 #!/usr/bin/Rscript( R 스크립트의 표준 관행 이 아닌) 경우에만 작동합니다 .
gented

16

조금 더 시도하십시오 . littlerGNU R에 대한 해시 뱅 (예 : #! / some / path로 시작하는 스크립트) 기능과 간단한 명령 줄 및 파이핑 사용을 제공합니다.


10

미구엘 산체스의 반응은 그래야만합니다. Rscript를 실행하는 다른 방법은 시스템 전체 RScript를 실행하는 'env'명령 일 수 있습니다.

#!/usr/bin/env Rscript

1
"시스템 전체"가 아니라 자신의에서 env처음 Rscript발견 된 것을 실행하도록 허용 하여 시스템 전체 / 기본값 (에 설치되지 않을 수 있음 ) 이 아닌 다른 것을 $PATH실제로 실행할 수 있도록 합니다. 특히 표준 위치에 설치되지 않을 수 있으므로 for 및 stuff를 사용 하는 것이 좋습니다 . ( 하지만 일반 스크립트는 일반적으로 항상 안전하게를 사용할 수 있습니다 .)Rscript/usr/whateverenvRRscriptbash#!/bin/bash
michael

@michael 아니요, Bash에 대해 틀 렸습니다. 이것은 위험한 조언입니다. 안전하게 하드 코딩 할 수있는 유일한 것은 /bin/sh. 다른 모든 것은 env조회를 사용해야합니다 . 특히 Bash는 컴퓨팅 클러스터에서 구식이며 사용자는 자체 사용자 정의 설치 (일반적으로에서 ~/.local/bin또는 /softwareNFS 마운트 와 같은 공유 )를 가지고 있습니다. 마찬가지로, 맥 OS에 /bin/bash있습니다 항상 인한 문제를 라이센스에 오래된, 그리고 배쉬가 더 일반적으로에 위치 날짜에 최대 /usr/local/bin/bash(나는 당신의 의견은 3 세입니다 그러나 이것은 매우 중요합니다 알고 있습니다.)
콘라드 루돌프

아니요, 죄송합니다. 그건 사실이 아닙니다. 하지만 당신은이 문제에 대해 강한 의견을 가지고 있으므로이 문제에 대해서는 토론하지 않겠습니다. 사용 /bin/sh이 어떤 경우에도 "위험"이 아닌 경우에도 동일하게 말할 수 있음을 인정해야합니다 /bin/bash. 다른 사용자에 대한 env안정적이고 일관되지 않은 PATH설정 으로 인해 사용 은 더 예측할 수 없지만 각 R 사용자는 실제로이 동작을 원할 수 있지만 bash스크립트는 그렇지 않습니다. 마지막으로 CI / 클라우드가 최신 bash 스크립트를 호출하려면 단순히 /path/to/my/bash myscript경로를 사용하여 호출 하거나 명시 적으로 경로를 설정하고 env script. EOT
michael

9

#!/path/to/RR 자체가 스크립트이기 때문에 작동하지 않으므로 execve불행합니다.

나는 사용한다 R --slave -f script


4
평범한 독자에게 참고하십시오 : 궁금한 점이 있으면 이러한 답변이 날짜 이전에 Rscript(및 littler) 많이 있습니다.
michael

@michael 여기에 대한 답변은 R 2.5.0과 함께 2007 년에 출시 된 Rscript 이전에 해당되지 않습니다.
콘라드 루돌프


4

이것은 작동합니다.

#!/usr/bin/Rscript

하지만 컴퓨터에 R 버전이 두 개 이상 설치되어 있으면 어떻게되는지 모르겠습니다.

이렇게하면

#!/usr/bin/env Rscript

인터프리터에게 경로에서 처음 나타나는 R을 사용하도록 지시합니다.


2

스크립트를 실행하는 데 사용하는 프로그램에 매개 변수가 필요한 경우 #! 선:

#!/usr/bin/R --random --switches --f

R을 모르면 제대로 테스트 할 수 없지만 작동하는 것 같습니다.

axa@artemis:~$ cat r.test
#!/usr/bin/R -q -f
error
axa@artemis:~$ ./r.test
> #!/usr/bin/R -q -f
> error
Error: object "error" not found
Execution halted
axa@artemis:~$

2

이 게시물에 추가 할 메모입니다. 이후 버전은 다소 R묻혀 있는 것 같습니다 Rscript. OSX 잰 2015 다운로드 R 3.1.2-1의 경우에 내가 발견 Rscript에서

/sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript

따라서, 대신 #! /sw/bin/Rscript스크립트 상단에 다음을 사용해야했습니다.

#! /sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript

locate Rscript도움 이 될 수 있습니다.


이 답변은 OP가 참조하는 플랫폼 (* nix 또는 Mac OS)이 명확하지 않기 때문에 잠재적으로 유용합니다. 약간의 재 작업을 통해 (코드 형식을 지정하고 사과의 시작 부분을 제거하십시오) 이것은 여기에 대한 답변에 좋은 추가가 될 것입니다.
BenBarnes

2
이 사용하는 또 다른 이유는 #!/usr/bin/env Rscript하드 코드 된 경로 대신 R스크립트 (당신에 그 긴 경로를 추가 $PATH)
마이클

0

파이썬의 rpy2 모듈을 사용할 수 있습니다. 그러나이를 수행하는 "올바른"방법은 R CMD BATCH를 사용하는 것입니다. 이를 수정하여 STDOUT에 쓸 수 있지만 기본값은 .Rout 파일에 쓰는 것입니다. 아래 예를 참조하십시오.

[ramanujan:~]$cat foo.R
print(rnorm(10))
[ramanujan:~]$R CMD BATCH foo.R
[ramanujan:~]$cat foo.Rout

R version 2.7.2 (2008-08-25)
Copyright (C) 2008 The R Foundation for Statistical Computing
ISBN 3-900051-07-0

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

[Previously saved workspace restored]


 ~/.Rprofile loaded.
Welcome at  Fri Apr 17 13:33:17 2009
> print(rnorm(10))
 [1]  1.5891276  1.1219071 -0.6110963  0.1579430 -0.3104579  1.0072677 -0.1303165  0.6998849  1.9918643 -1.2390156
>

Goodbye at  Fri Apr 17 13:33:17 2009
> proc.time()
   user  system elapsed
  0.614   0.050   0.721

참고 : --vanilla 및 기타 옵션을 사용하여 모든 시작 문제를 제거하는 것이 좋습니다.


0

명령 줄에서 빠른 R 스크립트를 작성하려면 smallR을 사용해보십시오.

http://code.google.com/p/simple-r/

(r 디렉토리의 명령)

smallR을 사용하여 명령 줄에서 플로팅하는 것은 다음과 같습니다.

r -p file.txt

2
(죽은 것처럼 보이는) 이것보다 littler확실히 선호 될 것입니다 (아직 살아 있기 때문에); 또는, 단지 사용 Rscript(실제로 이후에 나온하는 littler만들었습니다.)
마이클

-1

다음은 Windows에서 MSYS bash를 사용하여 나를 위해 작동합니다. Linux 상자에 R이 없으므로 거기에서 시도 할 수 없습니다. 두 개의 파일이 필요합니다. runr 라는 첫 번째 파일은 파일 매개 변수로 R을 실행합니다.

# this is runr
# following is path to R on my Windows machine
# plus any R params you need
c:/r/bin/r --file=$1

chmod + x runr 로이 실행 파일을 만들어야합니다. .

그런 다음 스크립트 파일에서 :

#!runr
# some R commands
x = 1
x

#! 명령을 사용하는 방법, PATH 변수 설정 방법 등에 따라 runr 행에 runr의 전체 경로를 포함해야 할 수 있습니다.

예쁘지는 않지만 작동하는 것 같습니다!


1
다른 매개 변수가 필요한 다른 R 스크립트는 어떻습니까? 명령 줄에서 R 스크립트에 인수를 전달하는 것은 어떻습니까?
blahdiblah 2009
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.