2010-05-05 34 views
25

當我啓動我的R環境時,我經常運行長R腳本。我希望能夠在Emacs/ESS中加載/運行R腳本,並在其他緩衝區中繼續其他工作。我怎樣才能在ESS/Emacs中使用R進程?

當我按下C-g或C-c C-c時,過程中斷,我必須重新啓動腳本。

在ESS/Emacs中背景R過程的最佳方式是什麼?

編輯:感謝您的回答和評論,但他們都沒有解決Emacs在加載/運行大型腳本時無法凍結並且無法更改緩衝區這一事實。

我想我的問題是一個更一般的 - Emacs可以背景的過程,讓你繼續工作?

+0

使用C-C C-l來執行腳本。 – 2010-05-06 03:59:59

回答

19

ESS將R運行爲異步進程。你不需要任何背景。你可以運行你的代碼幾個小時,並仍然可以在ESS中不間斷地工作。

你的問題似乎是別的。當你執行你的腳本時,你會「明顯地」執行它,即你的執行代碼被打印到終端上。這導致Emacs凍結。

設置ess-eval-visibly到零和的代碼大塊將被髮送至R瞬間:

(setq ess-eval-visibly nil) 

乾杯。

[更新]

沒有爲ess-eval-visibply在最近版本的ESS的新設置 - 「NOWAIT。它將你的代碼放在一個劣質緩衝區中,然後發送給子進程。這樣你可以看到你的代碼和所有的輸出,而不用等待子進程完成。

[/ update]

+0

如果您最終在不能評估emacs lisp的不同ess環境中,可以通過確保您的函數將其結果分配給變量來獲得相同的結果。而不是'long.running()'做'res < - long.running()'。 – Wilduck 2012-01-12 14:59:41

+0

小更新:從ESS版本12.09-1開始,現在不推薦使用'ess-eval-visibly-p'。應該使用'ess-eval-visibly'。請參閱:http://ess.r-project.org/Manual/ess.html。 – Vince 2017-06-15 19:36:26

+0

@Vince謝謝。我已經更新了答案。 – VitoshKa 2017-06-25 09:07:52

3

M-x R將啓動R會話(默認緩衝區名稱爲*R*)。如果再次按M-x R,則將啓動第二個R會話(緩衝區名稱爲*R:2*)。

每個會話都有自己的R進程,所以你可以在一個運行一個長的R腳本並且仍然獨立使用另一個。

C-x C-b調出緩衝區列表,這將允許您在R個會話之間切換。

或者,如果你把

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

.emacs初始化文件,然後按C-c r你會被提示輸入你想切換到其中R會話(緩衝)每次。如果你只有一個會話,它會自動切換到那裏。

+0

已經有'ess-request-a-process' C-c C-k的綁定,但是由於某些特殊和完全未知的原因,它默認爲「S」,即使您將「R」設置爲默認值。 – aL3xa 2010-12-08 03:54:21

-1

根據我個人的經驗,ESS不擅長處理非常大的腳本,因爲有時Emacs的其他部分變得無法使用。也許你最好在ESS中進行開發,然後在BATCH模式下運行完整的腳本。