Chạy tập lệnh R từ dòng lệnh


484

Tôi có một tập tin, được gọi a.r, nó có chmod755,

sayHello <- function(){
   print('hello')
}

sayHello()

Làm thế nào tôi có thể chạy nó thông qua dòng lệnh?



5
tl; dr: chỉ cần thêm làm dòng đầu tiên trong kịch bản của bạn:#!/usr/bin/env Rscript
michael

Câu trả lời:


671

Nếu bạn muốn đầu ra in ra thiết bị đầu cuối, tốt nhất là sử dụng Rupcript

Rscript a.R

Lưu ý rằng khi sử dụng R CMD BATCH a.Rthay vì chuyển hướng đầu ra sang tiêu chuẩn và hiển thị trên thiết bị đầu cuối, một tệp mới có tên a.Rout sẽ được tạo.

R CMD BATCH a.R
# Check the output
cat a.Rout

Một điều khác cần lưu ý về việc sử dụng Rupcript là nó không tải methodsgói theo mặc định có thể gây nhầm lẫn. Vì vậy, nếu bạn đang dựa vào bất cứ điều gì mà phương thức cung cấp, bạn sẽ muốn tải nó một cách rõ ràng trong tập lệnh của mình.

Nếu bạn thực sự muốn sử dụng ./a.Rcách gọi tập lệnh, bạn có thể thêm phần thích hợp #!vào đầu tập lệnh

#!/usr/bin/env Rscript
sayHello <- function(){
   print('hello')
}

sayHello()

Tôi cũng sẽ lưu ý rằng nếu bạn đang chạy trên hệ thống * unix, có gói littler hữu ích cung cấp đường ống dòng lệnh dễ dàng đến R. Có thể cần phải sử dụng littler để chạy các ứng dụng sáng bóng thông qua tập lệnh? Thông tin chi tiết có thể được tìm thấy trong câu hỏi này .


28
Nếu không có #! dòng lệnh của bạn cố gắng chạy nó dưới dạng một tập lệnh dòng lệnh, sử dụng cùng một trình thông dịch để diễn giải các lệnh của bạn. Nó không biết nó được coi là R, ngay cả khi tệp kết thúc bằng hậu tố .R hoặc .r. Các #! cho dòng lệnh biết ngôn ngữ nào được chứa trong tệp.
Spainedman

4
Tôi đã bắt gặp một vài câu hỏi ở đây trong những năm qua và có thể tham khảo cả littler và Rupcript. Điều chính là nói với mọi người, như bạn đã làm, đó R CMD BATCHlà khủng khiếp. Bất cứ điều gì khác ngoài điều đó ...
Dirk Eddelbuettel

@Dason Tôi cũng đang làm việc với tập lệnh R và tôi đang cố gắng thực thi tập lệnh R từ chương trình Java và tôi thấy một số lỗi. Đây là câu hỏi của tôi . Xem nếu bạn có thể giúp đỡ. Tôi đang sử dụng ví dụ chức năng hello của bạn để làm cho nó đơn giản.
dùng1950349

Có cách nào để sửa đổi đường dẫn thư viện trong chính lệnh không? Một cái gì đó tương tựR CMD INSTALL -l ~/R/lib-dev
mikemtnbike

@mikemtnbike Không phải tôi biết. Người ta luôn có thể thêm một cái gì đó để thay đổi .libPaths () bên trong tập lệnh. Nhưng tôi không thấy bất kỳ tùy chọn nào giống như được chỉ ra trong trang man cho Rupcript.
Dason

107

Điều này không trả lời câu hỏi trực tiếp. Nhưng ai đó có thể kết thúc ở đây vì họ muốn chạy một oneliner của R từ thiết bị đầu cuối. Ví dụ, nếu bạn chỉ muốn cài đặt một số gói bị thiếu và thoát, oneliner này có thể rất thuận tiện. Tôi sử dụng nó rất nhiều khi tôi đột nhiên phát hiện ra rằng tôi bỏ lỡ một số gói và tôi muốn cài đặt chúng vào nơi tôi muốn.

  • Để cài đặt đến vị trí mặc định:

    R -e 'install.packages(c("package1", "package2"))'
  • Để cài đặt đến một vị trí yêu cầu rootđặc quyền:

    R -e 'install.packages(c("package1", "package2"), lib="/usr/local/lib/R/site-library")' 

5
Để chạy một lệnh bạn cũng có thể sử dụng Rscript -e "getwd()"trong thiết bị đầu cuối. Rupcript sẽ chỉ in đầu ra lệnh chứ không phải thông báo khởi động R đầy đủ.
Paul Rougieux

Bạn cũng có thể sử dụng r -e "cat(getwd(),'\n')"nếu bạn đã cài đặt littler. Trong câu trả lời này, Dirk Eddelbuettel giải thích sự khác biệt giữa littler và Rupcript.
Paul Rougieux

2
Cảm ơn bạn đã lường trước vấn đề của tôi! Tôi cần một điều nữa:R -e 'install.packages("package", repos="http://cran.us.r-project.org")'
Erin

4
Người ta nên sử dụng R -r 'options(warn=2); install...'để tạm dừng việc thực thi và nhận mã lỗi khác không trong trường hợp cài đặt thất bại. Nếu không, bất kỳ install.packageslỗi nào chỉ là cảnh báo.
rvernica


21

Bạn cần ?Rscriptlệnh để chạy tập lệnh R từ thiết bị đầu cuối.

Hãy xem http://stat.ethz.ch/R-manual/R-devel/l Library / utils / html / Revcript.html

Thí dụ

## example #! script for a Unix-alike

#! /path/to/Rscript --vanilla --default-packages=utils
args <- commandArgs(TRUE)
res <- try(install.packages(args))
if(inherits(res, "try-error")) q(status=1) else q()

Đây chỉ là một ví dụ về cách bạn sẽ viết / chạy tập lệnh R, trong tệp của bạn thêm #! / Path / to / rscript và sau đó chmod + x <script của bạn.r> và ./<your script.r>
Mehul Rathod

10

Cách chạy Rmd trong lệnh với đan và đánh dấu lại bằng nhiều lệnh và sau đó Tải tệp HTML lên RPub

Dưới đây là một ví dụ: tải hai thư viện và chạy lệnh R

R -e 'library("rmarkdown");library("knitr");rmarkdown::render("NormalDevconJuly.Rmd")'

R -e 'library("markdown");rpubsUpload("normalDev","NormalDevconJuly.html")'

3
Lưu ý rằng sẽ đơn giản hơn để bỏ qua việc tải thư viện; R -e 'markdown::rpubsUpload("normalDev","NormalDevconJuly.html")'
gregmacfarlane

3

Tuy nhiên, một cách khác để sử dụng Rupcript cho các hệ thống * Unix là Thay thế quy trình .

Rscript <(zcat a.r)
# [1] "hello"

Điều này rõ ràng giống như câu trả lời được chấp nhận, nhưng điều này cho phép bạn thao tác và chạy tệp của mình mà không lưu nó vào sức mạnh của dòng lệnh, ví dụ:

Rscript <(sed s/hello/bye/ a.r)
# [1] "bye"

Tương tự như Rscript -e "Rcode"nó cũng cho phép chạy mà không lưu vào một tập tin. Vì vậy, nó có thể được sử dụng cùng với các tập lệnh tạo mã R, ví dụ:

Rscript <(echo "head(iris,2)")
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa

3

Chỉ để làm tài liệu, đôi khi bạn cần chạy tập lệnh như sudo:

sudo Rscript path/to/your/file.R

2
Khi nào bạn cần làm điều đó?
Simplegamer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.