忘掉Rstudio,來用VSCode愉快地進行R遠端開發

寫在前面

2019年底(其實也就是半個多月之前)聽了 renkun 大神在上海 R 會議的一個分享,分享主題是「Rstudio vs VSCode」,然後他緊接著又寫了兩篇使用 VSCode 進行 R 開發的部落格。仔細瞭解之後,感覺自己有救了。

之所以這麼說,是因為自己一直有個需求得不到很好的滿足:在本地方便的開發部署在遠端伺服器上的 Shiny 應用。

具體一點說,因為我的 Shiny 需要依託一些 Linux 下才能執行的程式,且這些程式對記憶體有要求,就導致我無法在 Windows 本地使用 WSL 進行測試和開發。而之前使用 VSCode Remote SSH 讓本地 VSCode 連線上伺服器本身沒問題,但是早期 R Console 執行得到的各種結果本身卻無法在 VSCode 中方便的檢視,總是需要跳出額外的各種視窗。

當然,使用 Rstudio Server 是一個選擇,但在實際使用中會有比如單一 session,時常未響應,編輯器各種不順手等等問題。

隨著幾位大神的開發加持,現在使用 VSCode 愉快地進行遠端 R 語言開發不僅成為了一種可能,而且還非常香,在使用體驗上基本不輸 Rstudio,而且很多小細節上更加貼心。

為什麼要用 VSCode 寫 R

大家可能會有一個非常真誠的疑問,Rstudio (server) 它不香嗎,寫 R 為什麼還要用其它編輯器? 下面這張幻燈片來自 renkun 在會議上的分享,基本說明了問題。

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

就像上圖總結的,RStudio 好用,幾乎是所有 R 使用者的最佳選擇。但同時像上文提到的,時不時的無響應帶來的各種不穩定,單 session 操作等又讓人苦惱。

你可能會有這樣的感受,使用 Rstudio 的過程中因為其本身需要一直和伺服器保持通訊,live R session 和語言服務又無法分離,當 Console 中運行了一個耗時或者耗記憶體的命令之後,整個 Rstudio 就無法進行任何操作了。

那 VScode 呢?這個編輯器本身的優點不必多說,雖然之前對 R 的支援沒那麼友好,不過最近幾個月在 VSCode 中使用 R 有了重大的體驗升級,這主要體現在兩個方面。

R Language Server 在後端的加持

vscode-R 外掛在前端的重大迭代

R Language Server

首先說 R Language Server,R Language Server 依託於 Language Server Protocol(可以讓任何語言在任何編輯器上得到很好的語法支援)。現在的 R Language Server 在 VScode 中已經非常好的支援了多種滑鼠懸停內容展示、幫助文件展示、自動補全、文字高亮以及程式碼格式化等功能。

R Language Server 和 Rstudio 相比差別最大的一點在於前者是真正的靜態分析(static analysis),指在不執行程式的條件下,進行程式分析的方法。也就是說所有功能的實現都無需執行程式碼,對程式碼進行的分析僅僅依賴程式碼本身。而且它的語言服務完全脫離於 R session,即便在 R session 非常繁忙的情況下依舊可以提供服務。

接下來僅僅列舉幾個在 Rstuido 中不是很方便實現或者無法實現的功能。

滑鼠懸停即顯示函式定義和文件,無論對應的包是否已經載入。

(箭頭處為滑鼠位置,下同)

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

滑鼠懸停在變數上,直接展示變數型別資訊

這個就類似於 Rstuido 中 environment 那個小框的功能,但是更方便直觀。

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

自動高亮文件內所有同一變數

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

選中程式碼,自動格式化,例如新增空格等。

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

vscode-R 新增 Session Watcher

vscode-R 外掛則在最近的更新中新增了一個 Session Watcher 功能,即便還在測試階段這個功能也足以讓人激動。

它實現了在 VSCode 中實時展示各種變數的需求

,View() 的時候再也不會有各種彈窗了。文字不好描述,直接上圖。

檢視 data。frame

如下圖右,直接檢視data。frame 內容,支援搜尋。

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

展示 ggplot 出圖

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

展示 htmlwidgets

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

透過SSH連線遠端伺服器

接下來簡單介紹如何實現在本地 VScode 中實現遠端 R 開發。

首先要實現的自然是遠端操作,這裡以使用 PC 透過 SSH 連線遠端 Linux 伺服器為例。

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

我們預設伺服器已經開通了ssh服務,然後本地 PC 已經正確安裝了 Windows OpenSSH Client。

安裝外掛 Remote-SSH

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

然後在命令列面板中找到 Remote-SSH 相關命令,可以直接選擇連結伺服器,也可以選擇開啟配置檔案。這裡我們選擇開啟配置檔案進行簡單的配置。

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

在配置檔案中可以輸入相應的使用者名稱 IP 地址以及埠等資訊。寫法如下圖所示,寫好儲存即可。

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

再選擇連線Host的命令,就會看到之前我們已經儲存好的 Host 選項。

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

點選對應的 Host,然後輸入密碼即可。

如果為了方便不想每次都輸入密碼,可以使用 SSH key 配置伺服器和本地的公鑰私鑰,這裡不再展開。

連線成功之後,VSCode 左下角就會顯示一個遠端連線的標誌,同時你還可以直接在 TERMINAL 中開啟一個 shell (我用的是 zsh),就像平時使用類似 Xshell 的工具一樣直接進行各種操作。

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

配置R語言開發環境

完成了遠端連線伺服器的工作,接下來是在 Remote 狀態下簡單進行 R 相關的配置。

首先安裝兩個必備的外掛,R 和 R LSP。然後還需要在伺服器的 R 中安裝一個R包 languageserver。

install。packages(“languageserver”)

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

隨後在設定介面中進行幾個關於 R 的設定。

首先是設定Linux下的R路徑,如果使用系統自帶的 R 應該是/usr/bin/R ,如果是使用自己目錄下,例如使用conda安裝的R則指定對應的 R 路徑。這裡推薦使用 Radian 替代 R,所以我的 R 路徑就指向了使用conda安裝的radian。如下圖所示。

如果使用 Radian的話,則需要勾選 Bracketed Paste 選項。

如果希望使用伺服器上的一些 R 配置,例如 。Rprofile和 。Renviron 檔案,那麼 Rterm Option 處就不要加什麼其它引數,如果不希望使用則可以酌情新增——no-init-file 或者 ——no-environ 等引數。

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

安裝外掛。在 Rstudio 中路徑的自動補全功能非常方便,在 VSCode 中則可以透過外掛 Path Autocomplete 來實現這個功能。

至此,就完成了在 VSCode 中使用 R 所需要的一些基本配置,可以開工搬磚。

最終使用效果

直接上截圖。

左側為伺服器對應的檔案目錄,可以直接點選檢視編輯

中間是 R 指令碼,可以開心的寫程式碼

右邊是對應的網頁工具,直接檢視效果

下面是連線到伺服器的終端,可以在 zsh、R 以及 python 等終端任意切換。也可以同時開啟多個不同的 R 終端進行不同任務,互不干擾。

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

擴充套件資料:

Writing R in VSCode: A Fresh Start

Writing R in VSCode: Interacting with an R session

Remote Development using SSH

Quick start: SSH key

Y叔叔點評一下

我寫過好幾篇介紹不用RStudio的文章:

你所不知道的,R的N種開啟方式

radian: 用python寫的,號稱21世紀的R終端

R kernel in Jupyter notebook 3

R的全新IDE

VSCode裡愉快地使用R

而VSCode也介紹過,和這篇正好有姐妹篇的感覺。我在給學生上課的時候,就發現很多學生RStudio等同於R,沒有RStudio,大家不會用R,這是很危險的。做為程式設計語法,即使工具再好用,你也要試一下原生態,有個文字編譯器你就能寫程式碼,再有個解析器/編譯器,你的程式碼就能執行。工具好用,天天用,這沒問題,但做為開發人員,不能夠沒有這種整合工具之後,兩眼昏黑,不知所措!還是那句話,活人不能讓尿憋死!

在課上教學生寫R包的時候,有很多同學就抱怨說devtools要求裝Rtools,而這貨很大,我當時就跟他們講,不需要裝,因為你沒有編譯程式碼的需求,純R程式碼不需要。然後我再跟他們講,開發R包,不需要R包。以前沒有devtools包,人就不活了?命令列裡用R CMD build, R CMD check就行。一個個紛紛表示,出了Rstudio不會用R!這也就算了,還有同學就去問度娘,然後又找我說,你看人家簡書上的文章,就是用的devtools,devtools就是要求我們要裝Rtools(不相信老師,相信度娘和簡書,我也是服了),於是我拿出了我的Makefile給他們看,講解給他們聽(課上我是有介紹過make的,我

認為

他們理當聽得懂)。

忘掉Rstudio,來用VSCode愉快地進行R遠端開發

講了這麼多,無非就是寫程式碼嘛,起碼要有一段時間,強迫自己不使用整合化工具,就用文字編譯器,這樣才不至於成為整合化工具的奴隸。當然像Emacs, Vim,VSCode這些工具,本身也不比RStudio差多少,甚至於很多方面要比RStudio強,另外你將擁有更廣闊的天空,因為有各種各樣的程式語言支援,各種各樣的程式設計工具外掛(不針對R,但你也能用),這不是針對一個語言的工具所能比擬。

我在Emacs裡用R唯一不爽的地方就是畫圖要彈窗,這顯然Emacs是可以做到的,畢竟maxima跑在Emacs中畫圖就可以直接在Emacs裡呈現,但沒人去搞這個。另外隨著shiny和各種js畫圖包的封裝,你跑這些,總要跳轉到瀏覽器裡,逐漸也成為了問題。所以我覺得VSCode的Session Watcher非常有吸引力,解決了這個痛點。而遠端開發這種,對於Emacs來說,早已經有了。