2010-09-08 16 views
7

Tôi đã viết một tập lệnh shebang R và muốn thực thi tập lệnh đó từ tập lệnh Perl. Tôi hiện đang sử dụng system ($my_r_script_path, $r_script_arg1, $r_script_arg2, ...) và câu hỏi của tôi là làm thế nào tôi có thể xác minh kịch bản R kết thúc bình thường (không có lỗi hoặc cảnh báo).Làm thế nào để xác minh chấm dứt bình thường các tập lệnh R được thực hiện từ Perl?

đoán tôi nên làm cho tập lệnh R của tôi trả lại một số giá trị đích thực ở cuối, chỉ khi mọi thứ đều OK, sau đó nắm bắt giá trị này trong Perl, nhưng tôi không chắc chắn cách thực hiện điều đó.

Cảm ơn!

+1

http://stackoverflow.com/questions/3477916/using-perls-system#3478060 – daxim

+1

@daxim: Đó chỉ là một nửa câu trả lời. Một nửa còn lại là cách đặt trạng thái thoát trong tập lệnh R. Vì vậy, đây không chỉ là một câu hỏi Perl, do đó không phải là một bản sao của câu hỏi khác, vì vậy tôi cũng phản đối chuyển động để đóng câu hỏi này. –

+0

@Aristotle: Tôi tin rằng David đang đề xuất một giải pháp khi anh ấy nói về việc trả về giá trị thực sự trong kịch bản R. Nó không phải là một phần của yêu cầu. – Zaid

Trả lời

4

Bạn có thể đặt giá trị trả lại trong lệnh quit(), ví dụ: q(status=1). Mặc định là 0, xem thêm? Làm thế nào để nắm bắt được một trong Perl, giống như bắt bất kỳ giá trị trả lại khác trong Perl. Nó được lưu trong một biến đặc biệt $? nếu tôi nhớ đúng. Xem thêm các ví dụ trong perldoc cho system, nó sẽ được minh họa ở đó.

Trên sidenote, tôi chỉ sử dụng giao diện R-Perl. Bạn có thể tìm thông tin và ví dụ ở đây: http://www.omegahat.org/RSPerl/

Chỉ cần cho đầy đủ:

Vào đầu kịch bản của bạn, bạn có thể đặt một cái gì đó như:

options(
    warn=2, # This will change all warnings into errors, 
      # so warnings will also be handled like errors 
    error= quote({ 
     sink(file="error.txt"); # save the error message in a file 
     dump.frames(); 
     print(attr(last.dump,"error.message")); 
     sink(); 
     q("no",status=1,FALSE) # standard way for R to end after errors 
    }) 
) 

này sẽ tiết kiệm được thông báo lỗi, và thoát khỏi phiên R mà không lưu, với mã thoát 1 và không chạy .Last.

Tuy nhiên, giao diện R-Perl cung cấp nhiều khả năng hơn đáng để kiểm tra nếu bạn định thực hiện việc này thường xuyên hơn.

+0

Và làm cách nào tôi có thể nói ở cuối tập lệnh nếu mọi thứ đã OK (bao gồm cả cảnh báo)? Tôi có phải thiết lập một số thử khối xung quanh mỗi lệnh có thể thất bại? Hoặc là có một số cách toàn cầu để chấm dứt ngay lập tức trên bất kỳ lỗi/cảnh báo và trả lại một số giá trị? –

+0

sử dụng các tùy chọn lỗi cho điều đó. Bạn có thể chỉ định bất kỳ hàm nào bạn muốn khi xảy ra lỗi, như tôi đã minh họa trước đây. Bạn cũng có thể thực hiện bất kỳ cảnh báo nào là lỗi bằng cách sử dụng các tùy chọn (warn = 2). xem thêm http://stackoverflow.com/questions/3650444/r-script-line-numbers-at-error/3660847#3660847 –

+0

Cảm ơn "đầy đủ" (+1) –

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