寫在前面
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 好用,幾乎是所有 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 中不是很方便實現或者無法實現的功能。
滑鼠懸停即顯示函式定義和文件,無論對應的包是否已經載入。
(箭頭處為滑鼠位置,下同)
滑鼠懸停在變數上,直接展示變數型別資訊
這個就類似於 Rstuido 中 environment 那個小框的功能,但是更方便直觀。
自動高亮文件內所有同一變數
選中程式碼,自動格式化,例如新增空格等。
vscode-R 新增 Session Watcher
vscode-R 外掛則在最近的更新中新增了一個 Session Watcher 功能,即便還在測試階段這個功能也足以讓人激動。
它實現了在 VSCode 中實時展示各種變數的需求
,View() 的時候再也不會有各種彈窗了。文字不好描述,直接上圖。
檢視 data。frame
如下圖右,直接檢視data。frame 內容,支援搜尋。
展示 ggplot 出圖
展示 htmlwidgets
透過SSH連線遠端伺服器
接下來簡單介紹如何實現在本地 VScode 中實現遠端 R 開發。
首先要實現的自然是遠端操作,這裡以使用 PC 透過 SSH 連線遠端 Linux 伺服器為例。
我們預設伺服器已經開通了ssh服務,然後本地 PC 已經正確安裝了 Windows OpenSSH Client。
安裝外掛 Remote-SSH
然後在命令列面板中找到 Remote-SSH 相關命令,可以直接選擇連結伺服器,也可以選擇開啟配置檔案。這裡我們選擇開啟配置檔案進行簡單的配置。
在配置檔案中可以輸入相應的使用者名稱 IP 地址以及埠等資訊。寫法如下圖所示,寫好儲存即可。
再選擇連線Host的命令,就會看到之前我們已經儲存好的 Host 選項。
點選對應的 Host,然後輸入密碼即可。
如果為了方便不想每次都輸入密碼,可以使用 SSH key 配置伺服器和本地的公鑰私鑰,這裡不再展開。
連線成功之後,VSCode 左下角就會顯示一個遠端連線的標誌,同時你還可以直接在 TERMINAL 中開啟一個 shell (我用的是 zsh),就像平時使用類似 Xshell 的工具一樣直接進行各種操作。
配置R語言開發環境
完成了遠端連線伺服器的工作,接下來是在 Remote 狀態下簡單進行 R 相關的配置。
首先安裝兩個必備的外掛,R 和 R LSP。然後還需要在伺服器的 R 中安裝一個R包 languageserver。
install。packages(“languageserver”)
隨後在設定介面中進行幾個關於 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 中則可以透過外掛 Path Autocomplete 來實現這個功能。
至此,就完成了在 VSCode 中使用 R 所需要的一些基本配置,可以開工搬磚。
最終使用效果
直接上截圖。
左側為伺服器對應的檔案目錄,可以直接點選檢視編輯
中間是 R 指令碼,可以開心的寫程式碼
右邊是對應的網頁工具,直接檢視效果
下面是連線到伺服器的終端,可以在 zsh、R 以及 python 等終端任意切換。也可以同時開啟多個不同的 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的,我
認為
他們理當聽得懂)。
講了這麼多,無非就是寫程式碼嘛,起碼要有一段時間,強迫自己不使用整合化工具,就用文字編譯器,這樣才不至於成為整合化工具的奴隸。當然像Emacs, Vim,VSCode這些工具,本身也不比RStudio差多少,甚至於很多方面要比RStudio強,另外你將擁有更廣闊的天空,因為有各種各樣的程式語言支援,各種各樣的程式設計工具外掛(不針對R,但你也能用),這不是針對一個語言的工具所能比擬。
我在Emacs裡用R唯一不爽的地方就是畫圖要彈窗,這顯然Emacs是可以做到的,畢竟maxima跑在Emacs中畫圖就可以直接在Emacs裡呈現,但沒人去搞這個。另外隨著shiny和各種js畫圖包的封裝,你跑這些,總要跳轉到瀏覽器裡,逐漸也成為了問題。所以我覺得VSCode的Session Watcher非常有吸引力,解決了這個痛點。而遠端開發這種,對於Emacs來說,早已經有了。