﻿# 建立 R 開發環境：起手式

要開始建立 [R](https://www.r-project.org/) 的互動執行環境，有些安裝與設定的步驟，對於完全沒用過 R 的人來說，可能會卡關一下。我特別寫了這篇文章，紀錄建立 R 開發環境的起手式，以及執行在 Docker 的一些注意事項。

### 安裝開發環境 (本機)

1.  安裝 [R](https://cran.r-project.org/) 執行環境
    
    安裝最新版
    
    -   [Download R for Linux](https://cran.r-project.org/bin/linux/)
    -   [Download R for (Mac) OS X](https://cran.r-project.org/bin/macosx/)
    -   [Download R for Windows](https://cran.r-project.org/bin/windows/)
    
    查詢舊版本: https://cran.r-project.org/bin/windows/base/old/
    
2.  安裝 [Rtools](https://cran.r-project.org/bin/windows/Rtools/) 工具
    
    > 從 R 4.0.0 開始(April 2020)，R for Windows 使用全新的工具組名稱，叫做 `rtools40`！
    

### 安裝開發環境 (Docker)

透過 Docker 應該是設定 R 執行環境最簡單的方式，只要到 Docker Hub 找到 [r-base](https://hub.docker.com/_/r-base) 容器映象，直接下載執行即可，這個 Docker Images 。

-   Interactive R
    
    最新版(`4.0.2`)
    
    ```powershell
    docker run -ti --rm r-base
    ```
    
    舊版
    
    ```powershell
    docker run -ti --rm r-base:3.6.3
    ```
    
    使用 `non-root` 身份執行 R 腳本
    
    ```powershell
    docker run -ti --rm -v ${PWD}:/home/docker -w /home/docker -u docker r-base:4.0.2 bash
    ```
    
-   Batch mode
    
    使用 `non-root` 身份執行 R 腳本 (過程會去找 [DESCRIPTION](https://cran.r-project.org/doc/manuals/r-release/R-exts.html#The-DESCRIPTION-file) 檔案)
    
    ```powershell
    docker run -ti --rm -v ${PWD}:/home/docker -w /home/docker -u docker r-base:4.0.2 R CMD check .
    ```
    
    在容器中批次執行 R 腳本的方法
    
    ```bash
    Rscript myscript.R
    ```
    

### 啟動 R 互動環境

-   預設啟動只要輸入「大寫」的 `R` 即可啟動
    
    ```bash
    R
    ```
    
-   退出互動環境只要按下 `Ctrl-D` 就可以退出，或執行 `q()` 函式
    
    ```bash
    q()
    ```
    
    > 第一次退出會出現 `Save workspace image? [y/n/c]:` 提示，按下 `y` 可儲存當前環境！ 可能會出現 `.Rhistory` 與 `.RData` 檔案。
    
-   啟動原始 R 互動環境
    
    有時候因為啟動目錄有大量暫存資料，這會導致 `R` 啟動時間超久，這時可以加上 `--vanilla` 大幅提高啟動速度。
    
    ```bash
    R --vanilla
    ```
    
    > 除此之外，有時 `.RData` 檔案會毀損，此時也可以透過這個參數跳過載入過程。
    

### 安裝套件

-   從 GitHub 安裝 (透過 [remotes](https://cran.r-project.org/web/packages/remotes/index.html) 套件)
    
    ```bash
    > install.packages("remotes")
    > remotes::install_github("privefl/bigsnpr")
    ```
    
-   從 CRAN 安裝
    
    ```bash
    > install.packages("xgboost")
    ```
    
    查詢安裝版本
    
    ```bash
    packageVersion("xgboost")
    ```
    
    安裝特定版本 (先到 CRAN 網站找到[套件](https://cran.r-project.org/web/packages/xgboost/index.html)，再找到 [Old sources](https://cran.r-project.org/src/contrib/Archive/xgboost/) 連結，再複製套件網址)
    
    ```bash
    install.packages('https://cran.r-project.org/src/contrib/Archive/xgboost/xgboost_0.71.2.tar.gz')
    ```
    
-   從 Terminal 安裝
    
    ```bash
    $ R -e "install.packages('jsonlite',dependencies=TRUE, repos='http://cran.rstudio.com/')"
    ```
    
-   從 Dockerfile 安裝
    
    ```dockerfile
    RUN R -e "install.packages('remotes',dependencies=TRUE, repos='http://cran.rstudio.com/')"
    RUN R -e "remotes::install_github('privefl/bigsnpr')"
    
    RUN R -e "install.packages('xgboost',dependencies=TRUE, repos='http://cran.rstudio.com/')"
    ```
    
    > 在 `r-base` 容器中設定的 library 預設路徑為 `/usr/local/lib/R/site-library`
    

### 載入 R 套件

-   安靜的載入套件 (載入失敗會回傳 `FALSE` 狀態)
    
    ```r
    library(jsonlite)
    ```
    
-   載入成功會回傳 `TRUE` 狀態，載入失敗會回傳 `FALSE` 狀態
    
    ```r
    require(jsonlite)
    ```
    

### 基本 R 語法

-   建立變數 `a` 並指派值為 `1`
    
    ```r
    a <- 1
    ```
    
-   印出 `a` 變數的內容
    
    ```r
    a
    ```
    
-   執行內建函式
    
    ```r
    Sys.time()
    ```
    
-   一次執行多個陳述式 (Statements)
    
    ```r
    Sys.time(); a <- "OK"; a; Sys.time();
    ```
    

### 相關連結

-   [The R Project for Statistical Computing](https://www.r-project.org/)
    -   [The R Manuals](https://cran.r-project.org/manuals.html)
-   [The Comprehensive R Archive Network](https://cran.r-project.org/) (CRAN)
-   [Download RStudio](https://rstudio.com/products/rstudio/download/)
-   [r-base - Docker Hub](https://hub.docker.com/_/r-base)
