2011-01-26 5 views
9

Tôi gặp khó khăn khi chuyển tên tệp đến tập lệnh R của mình. Tệp là tệp csv có tham số lô cho nhiều lần chạy tập lệnh. Tôi đang cố gắng đưa nó vào đây để người dùng không cần phải chỉnh sửa tập lệnh R để chỉ định vị trí của tệp đó.Dòng lệnh R chuyển tên tệp tới tập lệnh trong đối số (Windows)

My Dòng lệnh trong Windows Cú pháp là:

R CMD BATCH --slave "--args fn=batch.csv" myscript.r output.txt 

Gần nhất tôi đã nhận được để lấy này trong kịch bản R của tôi là bằng cách làm:

eval(parse(file=commandArgs()[8]))) 
batch_args = read.table(fn, sep=",") 

tôi đã thử nghiệm với commandArgs(trailingOnly=TRUE)parse(text=commandArgs()[8]), vv ., không có may mắn. Hầu hết tài liệu mà tôi đã thấy không áp dụng cụ thể để truyền tên tệp. Bất cứ ai có thể nghĩ ra một giải pháp?

+0

Tôi muốn giới thiệu sử dụng 'Rscript' thay vì' R CMD BATCH'. Bạn đang sử dụng phiên bản R nào? –

+0

Sử dụng R 2.12.0. Tôi có thể sử dụng Rscript sử dụng cú pháp tương tự? – Benjamin

+0

Không, cú pháp là khác nhau. So sánh '? Rscript' và'? BATCH'. –

Trả lời

17

Như tôi đã nói trong nhận xét của tôi, tôi sẽ sử dụng Rscript thay vì R CMD BATCH:

Rscript myscript.R batch.csv 

nơi myscript.R chứa:

args <- commandArgs(TRUE) 
batch_args <- read.table(args[1], sep=",") 
# loop over multiple runs 
+0

Với cú pháp chính xác này, tôi nhận được "Lỗi: không thể tìm thấy chức năng" batch_args ".Nếu tôi đặt một tuyên bố in (args)," batch.csv "là có, tuy nhiên – Benjamin

+0

Tôi không nhớ bằng cách sử dụng Rscript, nhưng có thể Tôi nhận được đầu ra bằng văn bản cho một tập tin tương tự như R CMD BATCH --slave? Tại sao là Rscript tốt hơn? – Benjamin

+0

@ Benjamin: Tôi nghĩ rằng bạn đã sao chép và/hoặc dán một cái gì đó sai.Không có cách nào mã tôi đăng sẽ cung cấp cho bạn rằng lỗi vì lỗi đó đòi hỏi một cái gì đó như 'batch_args()'. –

6

Bạn có ý nghĩa gì bởi 'không may mắn'? Tên tệp nằm trong đó, trong hàm commandArgs(), bạn chỉ cần tìm ra cách để lấy nó ra. Mã và thông báo lỗi rất tiện dụng.

Đó không phải là vấn đề nếu đối số phụ duy nhất là tên tệp, bạn biết vị trí của nó. Điều gây nhầm lẫn cho bạn là khi bạn bắt đầu có nhiều đối số phức tạp hơn.

Bạn cũng đang làm phức tạp những thứ bằng cách chuyển 'fn = foo.csv'. Chỉ cần chuyển tên tệp và gán nó cho fn trong tập lệnh của bạn. Nếu bạn thực sự muốn sử dụng eval bạn có thể cần phải trích dẫn tên tập tin của bạn, do đó myscript.r là:

ca = commandArgs(trailingOnly=TRUE) 
eval(parse(text=ca)) 
print(read.csv(fn)) 

và chạy như sau:

R --slave "--args fn='batch.csv'" < myscript.r 
    A B C 
    1 1 2 3 
    2 6 8 3 

đâu batch.csv là một tập tin csv đơn giản.

Bạn có thể lặp lại "ca" trong tập lệnh và đánh giá mọi thứ. Nó hơi nguy hiểm, vì bạn có thể dễ dàng phá vỡ chức năng cơ bản.

Cá nhân tôi muốn lặp lại ca, tìm cặp name = giá trị cho một nhóm tên đã biết và đặt chúng. Về cơ bản thực hiện getopt, nhưng ai đó đã có thể thực hiện điều đó đã ...

+0

Hầu hết các công trình, nhưng phá vỡ khi cố gắng để làm read.table vì "batch.csv" không được công nhận như một tên tập tin thích hợp nhưng là chuỗi. Tôi mặc dù cho nó đường dẫn đầy đủ có thể giúp đỡ, nhưng sau đó nó phá vỡ vì không gian.Hiện tại, tôi chạy nó từ thư mục chứa tất cả các tệp (.r, .txt và .csv). – Benjamin

+0

Không có thứ gì như 'tên tập tin thích hợp'. R lưu trữ tên tập tin theo chuỗi. fn = "batch.csv"; read.csv (fn) sẽ đọc từ tệp batch.csv. – Spacedman

+0

okay, ví dụ của tôi giờ đây đọc từ tệp csv dưới dạng chứng minh-khái niệm. – Spacedman

7

Ngoài việc sử dụng Rscript (như Josh đã nói), bạn cũng nên sử dụng các gói CRAN getopt hoặc optparse vì chúng được viết cho mục đích này.

+1

+1 cho con trỏ đến gói 'optparse'. – reprogrammer

2

thử

fn="batch.csv"; R CMD BATCH --slave "--args $fn" myscript.r output.txt