2009-04-15 51 views
96

Rất thuận tiện khi có tập lệnh R để thực hiện các ô đơn giản từ dòng lệnh. Tuy nhiên, chạy R từ tập lệnh bash không thuận tiện chút nào. Lý tưởng có thể là một cái gì đó giống nhưCách tốt nhất để sử dụng tập lệnh R trên dòng lệnh (terminal) là gì?

#!/path/to/R 
... 

hoặc

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

nhưng tôi đã không thể làm cho một trong những người làm việc.

Một tùy chọn khác là giữ tập lệnh hoàn toàn bằng R, ví dụ: script.R và gọi nó bằng R --file=script.R hoặc tương tự. Tuy nhiên, đôi khi một tập lệnh sẽ dựa vào các chuyển mạch dòng lệnh tối nghĩa mà tại đó phần điểm của mã tồn tại bên ngoài tập lệnh. Ví dụ: lén mọi thứ vào R từ bash thông qua một địa phương .Rprofile, các thiết bị chuyển mạch mong muốn sau đó tất cả mọi thứ --vanilla ngụ ý ngoại trừ --no-init-file.

Tùy chọn khác là tập lệnh bash để lưu trữ cờ R và không thực thi được, mà sau đó gọi tập lệnh R. Vấn đề là điều này có nghĩa là một chương trình duy nhất được chia thành hai tệp mà giờ đây phải được đồng bộ hóa, được chuyển sang máy mới cùng nhau, v.v.

Tùy chọn tôi hiện đang coi thường là nhúng R trong tập lệnh bash :

#!/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 

Mọi thứ trong một tệp. Nó thực thi và dễ dàng xử lý các đối số. Vấn đề là kết hợp bash và R như thế này khá nhiều loại bỏ khả năng của bất kỳ IDE không thất bại trên một hay khác, và làm cho trái tim tôi bị tổn thương thực sự xấu.

Có cách nào tốt hơn tôi bị thiếu không?

Trả lời

114

Nội dung script.r:

#!/usr/bin/Rscript 

cat("Hello") 

Gọi từ dòng lệnh:

./script.r 
+1

Vâng, tôi nghĩ đây là cách "chính thức" để làm điều đó. – Frank

+5

Và chạy 'Rscript --help' từ dòng lệnh sẽ liệt kê rất nhiều tùy chọn hữu ích có thể thêm vào shebang, chẳng hạn như' --vanilla'. – flodel

+7

Hãy cũng đề cập đến hàm 'commandArgs' và các gói' getopt' và 'optparse' để phân tích cú pháp dòng lệnh. Vì vậy, các đối số và các tùy chọn cũng có thể được truyền cho các kịch bản của bạn khi chạy từ dòng lệnh. – flodel

-1

Các công trình sau đây cho tôi sử dụng MSYS bash trên Windows - Tôi không có R trên hộp Linux của mình nên không thể thử ở đó. Bạn cần hai tập tin - người đầu tiên gọi là runr thực R với một tham số tập tin

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

Bạn cần đảm thực thi này với chmod + x runr.

Sau đó, trong tập tin kịch bản của bạn:

#!runr 
# some R commands 
x = 1 
x 

Lưu ý #! dòng runr có thể cần phải bao gồm đường dẫn đầy đủ để runr, tùy thuộc vào cách bạn đang sử dụng lệnh, cách biến PATH của bạn được đặt vv.

Không đẹp, nhưng có vẻ như nó hoạt động!

+1

Còn các tập lệnh R khác nhau cần thông số khác nhau thì sao? Điều gì về truyền đối số cho các kịch bản R từ dòng lệnh? – blahdiblah

16

Hãy thử littler. littler cung cấp khả năng hash-bang (tức là tập lệnh bắt đầu bằng #!/Some/path) cho GNU R, cũng như sử dụng đường dẫn và đường ống đơn giản.

2

Nếu chương trình bạn đang sử dụng để thực thi tập lệnh của bạn cần tham số, bạn có thể đặt chúng ở cuối #!dòng:

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

Không biết R, tôi không thể kiểm tra đúng, nhưng điều này dường như làm việc:

[email protected]:~$ cat r.test 
#!/usr/bin/R -q -f 
error 
[email protected]:~$ ./r.test 
> #!/usr/bin/R -q -f 
> error 
Error: object "error" not found 
Execution halted 
[email protected]:~$ 
0

Bạn có thể muốn sử dụng mô-đun rpy2 python. Tuy nhiên, cách "đúng" để làm điều này là với R CMD BATCH. Bạn có thể sửa đổi điều này để ghi vào STDOUT, nhưng mặc định là ghi vào tệp .Rout. Xem ví dụ bên dưới:

[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 

Lưu ý: bạn sẽ muốn thử tùy chọn --vanilla và các tùy chọn khác để xóa tất cả các hành trình khởi động.

8

#!/path/to/R sẽ không hoạt động vì R chính nó là tập lệnh, vì vậy execve không hài lòng.

tôi sử dụng R --slave -f script

+3

Fyi đối với người đọc thông thường: rất nhiều câu trả lời được đặt trước là «Rscript' (và' littler'), trong trường hợp bạn đang tự hỏi. – michael

9

Phản hồi của Miguel Sanchez là cách cần thiết. Một cách khác để thực thi Rscript có thể là lệnh 'env' để chạy hệ thống RScript rộng.

#!/usr/bin/env Rscript 
+1

Không phải là "toàn hệ thống", mà đúng hơn là 'env' sẽ cho phép bạn chạy' Rscript' đầu tiên được tìm thấy trong '$ PATH' của riêng bạn, do đó cho phép một thực sự chạy một cái gì đó _other_ hơn một hệ thống/mặc định' Rscript' (có thể không được cài đặt trong '/ usr/whatever'). Tôi khuyên bạn nên sử dụng 'env' cho các công cụ' R' và 'Rscript', vì chúng đặc biệt có thể không được cài đặt ở những nơi tiêu chuẩn. (Kịch bản 'bash' thông thường có thể sử dụng' #!/Bin/bash' một cách an toàn.) – michael

0

Hãy thử smallR để viết kịch bản R nhanh chóng trong dòng lệnh:

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

(r lệnh trong thư mục)

Vẽ từ dòng lệnh sử dụng smallR sẽ trông như thế này :

r -p file.txt 
+1

Thay vì điều này (có vẻ như đã chết), 'littler' chắc chắn sẽ được ưa chuộng hơn (vì nó vẫn còn sống); hoặc, chỉ cần sử dụng 'Rscript' (mà thực sự xuất hiện sau khi 'littler' được tạo ra.) – michael

5

Công trình này,

#!/usr/bin/Rscript 

nhưng tôi không biết điều gì xảy ra nếu bạn có nhiều hơn 1 phiên bản R được cài đặt trên máy của bạn.

Nếu bạn làm điều đó như thế này

#!/usr/bin/env Rscript 

nó nói với người phiên dịch để chỉ cần sử dụng bất cứ điều gì R xuất hiện đầu tiên trên con đường của bạn.

4

Chỉ cần ghi chú để thêm vào bài đăng này. Các phiên bản sau của R dường như đã bị chôn vùi Rscript phần nào. Đối với R 3.1.2-1 trên OSX tải tháng 1 năm 2015 tôi thấy Rscript trong

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

Vì vậy, thay vì một cái gì đó giống như #! /sw/bin/Rscript, tôi cần thiết để sử dụng sau đây ở phía trên cùng của kịch bản của tôi.

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

locate Rscript có thể hữu ích cho bạn.

+0

Đây có phải là câu trả lời không? – dario

+0

Câu trả lời này có khả năng hữu ích vì không rõ nền tảng nào (* nix hoặc Mac OS) mà OP đề cập đến. Với một chút tái làm việc (nhìn vào mã định dạng và loại bỏ sự bắt đầu xin lỗi), đây sẽ là một bổ sung tốt cho câu trả lời ở đây. – BenBarnes

+0

Đây là một lý do khác để sử dụng '#!/Usr/bin/env Rscript' thay vì đường dẫn mã hóa cứng trong các tập lệnh' R' (và thêm đường dẫn dài đó vào '$ PATH') của bạn – michael

Các vấn đề liên quan