--- disqus: ncyubrdecoinfo --- # R 的基本操作 R 一開啟的時候會出現類似[終端機](https://zh.wikipedia.org/wiki/終端)的介面顯示, 如下圖 2-1 所示, ![R Console](img/ch1_r_console.png) ![R Console](https://i.imgur.com/nCQYyzq.png) 圖 2-1、R console (這裡以 RStudio 為例) 圖 2-1 是使用 [RStudio](http://rstudio.com) 開啟 R console。上半部顯示 R 的版本、平台(platform)、版權的宣告及相關資訊等。最下面有個大於(>)符號,後方游標閃爍,在這個「大於」符號後面是接受輸入命令區,你可以在這邊輸入 R 的指令。 在解釋 R console 使用之前,先解釋電腦程式語言的兩大類群,分別為編譯式語言(compiled language)及直譯式語言(interpreted language)。編譯式語言需要透過[編譯器(compiler)](https://zh.wikipedia.org/wiki/編譯器) 把程式碼翻譯成機器能懂得二進位碼,而直譯式語言則直接在直譯器中輸入程式碼即可。R 語言就是一種直譯式的語言,只要把指令輸入在 R console 中,R 就會直接執行不需要額外再透過編譯器。 在 R console 中,隨時都可以接受指令的輸入,原則上 R 會一行一行的執行,你可以把這裡當成計算機,例如你可以試著輸入 $$ 3 \times 128 $$ (相乘使用 「*」符號,數學運算的部分後面的章節會再詳細解釋)。 ```R > 3*128 [1] 384 ``` 第二個例子是 5 除以 3: ```R > 5 / 3 [1] 1.666667 ``` 眼尖的你可能會發現到上面的第一個例子沒有空格,第二個例子有空格。 在 R 裡面運算符號和數值之間的空格不會影響到執行的結果, 但我建議你可以在數值和運算符號中保留空格, 這可以讓閱讀 R 程式碼時更加舒適且美觀。 ### 註解 在撰寫 R 語言時,只要開頭有井字號(#)的 R 都會把它視為註解。 因此不論後面再加上什麼指令或函式,R 都會把這些當成註解不執行, 例如: ```R # 這是註解 #### 這也是註解 ``` 如果你有多行文字需要註解,在 RStudio 中,你可以把這幾行選取起來,在選單 Code 中的 Comment/Uncomment Lines 把這幾行註解起來。或是使用快速鍵 Shift-Ctrl-C (MacOS 則是 Shift-Command-C)註解。而註解有何用處呢?就是能夠把 R 程式中額外需要解釋的,像是某功能代表什麼意思?各個參數的限制,有沒有什麼其他值得給自己或他人參考的文字內容等。另外註解還有一個很重要的功能就是幫助自己回憶 code,當你花了許多時間寫了許多 R code,過了一段時間可能忘記到底在寫些什麼,這些註解就可以幫助你回憶。比如說下面是一個 R 函式,我就會在函式的前方寫這個函式是在做什麼、輸入資料的類型以及參數解釋等: ```R ## [FUNCTION] Find countries in focal list and store PolySet in a vector # # arguments: # * ref_area.prj: projected area (SpatialPolygon object) # * focal_list: focal list # find_focal <- function(ref_area.prj, focal_list) { require(PBSmapping) focal_list.ps <- vector(mode="list", length=length(focal_list)) for ( i in 1:length(focal_list) ) { # check if the focal_list names match the fieldname in ref_area.prj if ( focal_list[i] %in% ref_area.prj$NAME ) { focal_list.ps[[i]] <- combinePolys(SpatialPolygons2PolySet(ref_area.prj[ref_area.prj$NAME==focal_list[i],])) } else { print(paste("Error!", focal_list[i],"does not match in the reference area", sep=" ")) } } return(focal_list.ps) } ``` ### 使用函式及表示式 R 裡頭執行指令或是函式(function)時,必須要加上括號,例如 ```ls()```,如果沒有加上括號「()」,R 預設就會把其原始碼在螢幕上印出,例如: ```R > ls function (name, pos = -1L, envir = as.environment(pos), all.names = FALSE, pattern, sorted = TRUE) { if (!missing(name)) { ... 中間省略 ... } } grep(pattern, all.names, value = TRUE) } else all.names } <bytecode: 0x1039a66e0> <environment: namespace:base> ``` 若輸入的指令為 ```ls()``` 時才會正確去執行該函式,即: ```R > ls() character(0) ``` 如何自訂函式我們會在後面的[自訂函式](https://hackmd.io/s/S1FsWYQWX)章節裡頭介紹。 ### 指定變數(variables) 對於複雜一點的 R 程式,也許你會想有沒有什麼其他的方式可以重複使用計算過的數值、或是執行過的函式呢?舉例來說,我想計算 15 塊錢美金可以換算成多少新臺幣, 假設一塊美金可以換成 31.53 新臺幣,R 可以這樣計算: ```R > 15 * 31.53 [1] 472.95 ``` 但每天的美金兌換新臺幣的匯率都不同,這個時候我們就可以把「匯率」當成一個「變數(variable)」,顧名思義,變數就是會「變」動的「數」值(或文字、函式等)。所以我們用變數的概念來呈現上述的例子: ```R 變數名稱 <- 數值或文字、函式 ``` 其中 ```<-``` 代表「指定(assign)」的意思,在 R 的語法中,你也可以使用 ```=``` 來代表「指定」變數或函式,但為了不讓初學者和邏輯上的相等(R 使用兩個等號 ```==```)混淆,在這裡我們建議使用 ```<-``` 來代表指定變數。因此計算匯率的語法可以這麼寫: ```R # 把 USDTWD 這個變數指定數值為 31.53 > USDTWD <- 31.53 # 計算 15 塊美金等於多少新臺幣 > 15 * USDTWD [1] 472.95 ``` 另外,當你選擇變數的時候,可能會有數值或文字的差異,在 R 和 Excel 不同的是,R 在處理數值或文字資料時必須先定義好其類型,一般來說 R 的資料分為數值類及文字類這兩大類型。如果是數值類型的資料,使用時直接輸入數字即可,例如: ```R > a_number <- 123.5 > a_numer [1] 123.5 > b_number <- 50 > b_number [1] 50 ``` 若是文字資料,則需要加上引號('')或雙引號(""),例如: ```R > character_a <- 'Veni, vici, vidi' > character_a [1] "Veni, vici, vidi" > character_b <- "Hello world!" > character_b [1] "Hello world!" ``` 像上面例子的文字資料,通常我們稱字串(string)或是文字(character)。而數值資料則包括整數(integer)、實數(numeric)、雙精確數(double-precision number)、複數(complex)等。另外還有一類特殊的資料類型,在 R 裡頭會使用 ```NA``` (Not Available; 不是數值或不存在此物件,通常是缺乏資料) 或 ```NaN``` (Not a Number; 不屬於數值)來表示。若數值資料無限大,則是使用 ```inf``` 來表示。