2010-05-05 25 views
25

Tôi thường chạy các tập lệnh R dài khi khởi động môi trường R của mình. Tôi muốn có thể tải/chạy tập lệnh R trong Emacs/ESS và tiếp tục công việc khác trong bộ đệm khác.Làm cách nào để tôi có thể xử lý quy trình R trong ESS/Emacs?

Khi tôi nhấn C-g hoặc C-c C-c, quy trình bị gián đoạn và tôi phải khởi động lại tập lệnh.

Cách tốt nhất để nền quy trình R trong ESS/Emac là gì?

EDIT: Cảm ơn bạn đã trả lời và nhận xét, nhưng không ai trong số họ giải quyết thực tế là Emacs bị đóng băng khi bạn tải/chạy một tập lệnh lớn và bạn không thể thay đổi bộ đệm.

Tôi cho rằng câu hỏi của tôi hơi chung chung hơn một chút - liệu Emac có thể thiết lập một quy trình để bạn tiếp tục làm việc không?

+0

sử dụng C-c C-l để thực thi tập lệnh. –

Trả lời

19

ESS chạy R dưới dạng quá trình không đồng bộ. Bạn không cần phải nền bất cứ điều gì. Bạn có thể chạy mã của bạn trong nhiều giờ và vẫn hoạt động trong ESS không bị gián đoạn.

Sự cố của bạn có vẻ là một vấn đề khác. Khi bạn thực thi kịch bản của bạn, bạn làm điều đó "rõ ràng", tức là mã thực thi của bạn được in tới thiết bị đầu cuối. Điều này gây ra Emacs đóng băng.

Set ess-eval-visibly tới bằng không và khối lượng lớn các mã sẽ được gửi đến R ngay lập tức:

(setq ess-eval-visibly nil) 

Cheers.

[cập nhật]

Có một cài đặt mới cho ess-eval-visibply trong các phiên bản gần đây của ESS - 'nowait. Nó đặt mã của bạn trong một bộ đệm kém hơn và sau đó gửi nó đến tiến trình con. Bằng cách này bạn có thể thấy mã của bạn và tất cả các đầu ra sau đó mà không cần chờ đợi cho tiến trình con để kết thúc.

[/ update]

+0

Nếu bạn kết thúc trong một môi trường ess khác, nơi bạn không thể/không muốn đánh giá và emacs lisp, bạn có thể đạt được kết quả tương tự bằng cách đảm bảo rằng chức năng của bạn được gán kết quả của nó cho một biến. Thay vì 'long.running()' do 'res <- long.running()'. – Wilduck

+0

cập nhật nhỏ: Tính đến ESS phiên bản 12,09-1, 'ess-eval-rõ ràng-p' hiện đang bị phản đối. Nên sử dụng 'ess-eval-visible '. Xem: http://ess.r-project.org/Manual/ess.html. – Vince

+0

@Vince cảm ơn. Tôi đã cập nhật câu trả lời. – VitoshKa

3

M-x R sẽ bắt đầu phiên R (tên đệm mặc định là *R*). Nếu bạn nhấn lại M-x R, phiên R thứ hai sẽ được bắt đầu (với tên đệm *R:2*).

Mỗi phiên có quy trình R riêng, vì vậy bạn có thể chạy tập lệnh R dài trong một và vẫn sử dụng tập lệnh độc lập khác.

Nhấn C-x C-b sẽ hiển thị danh sách bộ đệm, danh sách này cho phép bạn chuyển đổi giữa các phiên R.

Hoặc, nếu bạn đặt

(global-set-key "\C-cr" 'ess-request-a-process) 

trong .emacs tập tin khởi tạo của bạn, sau đó mỗi lần bạn nhấn C-c r bạn sẽ được nhắc nhở mà phiên R (đệm) mà bạn muốn chuyển sang. Nếu bạn chỉ có một phiên, nó sẽ tự động chuyển sang đó.

+0

Đã có một ràng buộc đối với "C-c C-k", nhưng đối với một số lý do đặc biệt và hoàn toàn không rõ, nó mặc định là "S", ngay cả khi bạn đặt "R" làm mặc định. – aL3xa

-1

Theo kinh nghiệm cá nhân của tôi, ESS không phải là rất tốt trong việc xử lý các tập lệnh rất lớn, trong đó phần còn lại của Emacs trở nên không sử dụng được. Có lẽ bạn nên làm phát triển trong ESS, sau đó chạy toàn bộ tập lệnh ở chế độ BATCH.

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