วิธีที่ดีที่สุดในการใช้สคริปต์ R บนบรรทัดคำสั่ง (เทอร์มินัล) คืออะไร?


115

สะดวกมากที่จะมีสคริปต์ R สำหรับสร้างพล็อตอย่างง่ายจากบรรทัดคำสั่ง อย่างไรก็ตามการเรียกใช้ R จากสคริปต์ bash นั้นไม่สะดวกเลย อุดมคติอาจเป็นเช่น

#!/path/to/R
...

หรือ

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

แต่ฉันไม่สามารถทำงานอย่างใดอย่างหนึ่งได้

อีกทางเลือกหนึ่งคือการเก็บสคริปต์ไว้ใน R อย่างหมดจดเช่นscript.Rและเรียกใช้โดยมีR --file=script.Rหรือคล้ายกัน อย่างไรก็ตามในบางครั้งสคริปต์จะอาศัยสวิตช์บรรทัดคำสั่งที่คลุมเครือซึ่งจุดใดส่วนหนึ่งของโค้ดอยู่นอกสคริปต์ ตัวอย่าง: ด้อมสิ่งที่เป็น R จากทุบตีผ่าน .Rprofile ท้องถิ่นสวิทช์ที่ต้องการอยู่แล้วทุกอย่างหมายถึงการยกเว้น--vanilla--no-init-file

อีกทางเลือกหนึ่งคือสคริปต์ทุบตีเพื่อจัดเก็บแฟล็ก R และเรียกใช้งานได้อย่างไม่ลำบากซึ่งจะเรียกสคริปต์ R ปัญหาคือว่านี่หมายความว่าโปรแกรมเดียวเพิ่งแยกออกเป็นสองไฟล์ซึ่งตอนนี้ต้องซิงค์โอนไปยังเครื่องใหม่ด้วยกัน ฯลฯ

ตัวเลือกที่ฉันดูถูกน้อยที่สุดในขณะนี้คือการฝัง 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 Rscriptแทนการเข้ารหัสเส้นทางไปยังการติดตั้ง R ของคุณอย่างหนัก มิฉะนั้นคุณอาจเสี่ยงต่อสคริปต์ของคุณทำลายบนคอมพิวเตอร์เครื่องอื่น

จากนั้นทำให้สามารถเรียกใช้งานได้ (บนบรรทัดคำสั่ง):

chmod +x script.r

การเรียกใช้จากบรรทัดคำสั่ง:

./script.r world
# Hello world

1
ใช่ฉันคิดว่านี่เป็นวิธีที่ "เป็นทางการ" ที่จะทำ
Frank

5
และการเรียกใช้Rscript --helpจากบรรทัดคำสั่งจะแสดงรายการตัวเลือกที่มีประโยชน์มากมายที่สามารถเพิ่มลงใน shebang เช่น--vanilla.
flodel

8
นอกจากนี้เรายังกล่าวถึงcommandArgsฟังก์ชันและgetoptและoptparseแพ็กเกจสำหรับการแยกวิเคราะห์บรรทัดคำสั่ง เพื่อให้สามารถส่งอาร์กิวเมนต์และตัวเลือกไปยังสคริปต์ของคุณได้เมื่อเรียกใช้จากบรรทัดคำสั่ง
flodel

1
สังเกตว่าสิ่งนี้ใช้ได้เฉพาะในกรณีที่#!/usr/bin/Rscript(ซึ่งไม่ใช่แนวปฏิบัติมาตรฐานสำหรับสคริปต์ R)
เสนอ

16

ลองใช้เศษขยะ . littlerให้ความสามารถ hash-bang (เช่นสคริปต์ที่ขึ้นต้นด้วย #! / some / path) สำหรับ GNU R ตลอดจนการใช้บรรทัดคำสั่งและการวางท่อ


10

การตอบสนองของมิเกลซานเชซเป็นแบบที่ควรจะเป็น อีกวิธีหนึ่งในการเรียกใช้ Rscript อาจเป็นคำสั่ง 'env' เพื่อเรียกใช้ RScript ทั้งระบบ

#!/usr/bin/env Rscript

1
ไม่ใช่ "ทั้งระบบ" แต่envจะอนุญาตให้คุณเรียกใช้สิ่งที่Rscriptพบครั้งแรกในตัวคุณเอง$PATHดังนั้นจึงทำให้สามารถรันสิ่งอื่นนอกเหนือจากทั้งระบบ / ค่าเริ่มต้นได้Rscript(ซึ่งอาจไม่สามารถติดตั้งได้/usr/whatever) ฉันอยากจะแนะนำให้ใช้envสำหรับRและRscriptสิ่งของเนื่องจากสิ่งเหล่านี้อาจไม่ได้รับการติดตั้งในสถานที่มาตรฐาน ( bashโดยทั่วไปแล้วสคริปต์ธรรมดาสามารถใช้ได้อย่างปลอดภัยเสมอ#!/bin/bash)
michael

@michael ไม่คุณผิดเกี่ยวกับ Bash และนี่เป็นคำแนะนำที่อันตราย /bin/shสิ่งเดียวที่สามารถได้อย่างปลอดภัยยากรหัสมี อย่างอื่นต้องใช้การenvค้นหา โดยเฉพาะอย่างยิ่งบ่อยครั้งที่ Bash ไม่ล้าสมัยในคลัสเตอร์การคำนวณและผู้ใช้มีการติดตั้งที่กำหนดเอง (โดยทั่วไปใน~/.local/binหรือใช้ร่วมกันในบางอย่างเช่น/softwareเมาท์ NFS) ในทำนองเดียวกันใน MacOS, /bin/bashถูกเสมอล้าสมัยเนื่องจากการออกใบอนุญาตปัญหาและถึงวันที่มีการทุบตีมากกว่าปกติอยู่ที่/usr/local/bin/bash(ผมตระหนักถึงความคิดเห็นของคุณคือ 3 ปี แต่นี่เป็นสิ่งที่สำคัญอย่างเป็นธรรม.)
คอนราดรูด

ไม่ขอโทษนั่นไม่เป็นความจริง คุณมีความคิดเห็นที่ชัดเจนเกี่ยวกับเรื่องนี้ดังนั้นฉันจะไม่อภิปรายปัญหานี้ ถ้าใช้/bin/shมีที่อยู่ในสถานการณ์ใด ๆ ที่ไม่ว่า "อันตราย" /bin/bashแล้วคุณต้องยอมรับเหมือนกันอาจจะกล่าวว่าสำหรับ การใช้งานenvนั้นไม่สามารถคาดเดาได้มากขึ้นเนื่องจากการPATHตั้งค่าที่เชื่อถือได้ / ไม่สอดคล้องกันสำหรับผู้ใช้ที่แตกต่างกัน แต่ผู้ใช้ R แต่ละคนอาจต้องการพฤติกรรมนี้ในขณะที่bashสคริปต์ไม่ต้องการ สุดท้ายสำหรับ CI / เมฆอัญเชิญสคริปต์ทุบตีใหม่ก็วิงวอนขอให้พวกเขาใช้หรืออย่างชัดเจนกำหนดเส้นทางและวิงวอนขอให้พวกเขาใช้/path/to/my/bash myscript env scriptEOT
michael

9

#!/path/to/Rจะไม่ทำงานเนื่องจาก R เป็นสคริปต์ดังนั้นจึงexecveไม่มีความสุข

ฉันใช้ R --slave -f script


4
Fyi ถึงผู้อ่านทั่วไป: คำตอบเหล่านี้จำนวนมากก่อนวันที่Rscript(และlittler) ในกรณีที่คุณสงสัย
michael

@michael ไม่มีคำตอบใด ๆ ที่นี่ก่อนหน้านี้ Rscript ซึ่งเปิดตัวในปี 2550 ด้วย R 2.5.0
Konrad Rudolph


4

ใช้งานได้

#!/usr/bin/Rscript

แต่ฉันไม่รู้ว่าจะเกิดอะไรขึ้นถ้าคุณติดตั้ง R มากกว่า 1 เวอร์ชันในเครื่องของคุณ

ถ้าทำแบบนี้

#!/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บ้าง สำหรับ R 3.1.2-1 บน OSX ที่ดาวน์โหลดเมื่อมกราคม 2015 ฉันพบ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)
michael

0

คุณอาจต้องการใช้โมดูล rpy2 ของ python อย่างไรก็ตามวิธีที่ "ถูกต้อง" คือการใช้ 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

ลอง smallR เพื่อเขียนสคริปต์ R ด่วนในบรรทัดคำสั่ง:

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

( rคำสั่งในไดเร็กทอรี)

การพล็อตจากบรรทัดคำสั่งโดยใช้ smallR จะมีลักษณะดังนี้:

r -p file.txt

2
แทนที่จะเป็นแบบนี้ (ซึ่งดูเหมือนตายไปแล้ว) littlerจะเป็นที่ต้องการอย่างแน่นอน (เนื่องจากมันยังมีชีวิตอยู่); หรือเพียงแค่ใช้Rscript(ซึ่งออกมาจริงหลังจากlittlerถูกสร้างขึ้น)
michael

-1

ต่อไปนี้ใช้ได้กับฉันโดยใช้ MSYS bash บน Windows - ฉันไม่มี R บนกล่อง Linux ของฉันจึงไม่สามารถลองได้ที่นั่น คุณต้องมีสองไฟล์ - ไฟล์แรกเรียกว่า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

หมายเหตุ #! บรรทัด runr อาจต้องรวมพา ธ เต็มไปยัง runr ขึ้นอยู่กับว่าคุณใช้คำสั่งอย่างไรตัวแปร PATH ของคุณถูกตั้งค่าอย่างไรเป็นต้น

ไม่สวย แต่ดูเหมือนได้ผล!


1
สคริปต์ R ที่แตกต่างกันที่ต้องการพารามิเตอร์ต่างกันอย่างไร สิ่งที่เกี่ยวกับการส่งอาร์กิวเมนต์ไปยังสคริปต์ R จากบรรทัดคำสั่ง?
blahdiblah
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.