R 是動態型別語言,所以一般來說不需要指定變數的型別。預設型別是numeric,通常以雙精度浮點數實作。若要強制使用 32 位元整數,請加上L後綴(Long的縮寫)。
取得物件的「型別」(基於歷史因素)可能會有點令人困惑。
函式typeof()和class()很相似,但回傳的結果可能略有不同:
typeof(50)
#> [1] "double" # more specific: an implementation detail
typeof(50L)
##> [1] "integer"
class(50)
#> [1] "numeric" # less specific: ignores implementation details
class(50L)
#> [1] "integer"
你可能也會看到mode()的相關說明,它和typeof()很相似。
請忽略mode()和storage.mode()。
它們只是為了回溯相容性而提供。
偏好的賦值運算子是<-。
如果在 RStudio 中工作,可以用鍵盤快速鍵Alt-minus輸入。
x <- 42
avogadro <- 6.02e23
mystr <- "Hello, World!"
使用=取代<-通常可行,但並非總是如此,而且被視為不好的風格,不建議這麼做。
運算子大多和許多其他語言相似,不過%%和%/%比較不尋常。
這種%語法是用來呼叫以巨集實作的中綴運算子的一種方式。
2 + 3 # 5
2 - 3 # -1
2 * 3 # 6
2 / 3 # 0.6666667
8 %/% 3 # 2 (integer division)
8 %% 3 # 2 (remainder)
2 ^ 3 # 8 (exponential)
在 R 中,#會開始一行單行註解。
多行註解沒有另外的語法。
定義一個函式:
squareit <- function(x) {
x * x
}
函式可以有零個或多個參數,以逗號分隔。
即使沒有參數,function()後面也需要括號()。
函式參數可以設定預設值,不過這些參數必須排在所有沒有預設值的參數之後,而且要用=而不是<-來設定預設值。
舉個沒什麼意義的例子:
squareit <- function(x = 42) {
x * x
}
squareit()
#> [1] 1764
單行函式主體並不嚴格要求使用大括號{ },但加上它們被認為是良好的風格。
R 會自動回傳函式的最後一個值,如上面的範例所示。
return()可以用在函式主體中的任何地方,讓回傳值變得明確。
它會立刻回傳指定的值並結束函式,而不執行函式主體中其餘的運算式。
通常只有在基於某些原因想提早離開函式並回傳特定值時,才需要明確呼叫return()。
其中一個例子可能是在if-else子句中。
不過,有些開發者基於程式風格的考量,偏好明確地使用return()。
呼叫函式和許多其他語言一樣:
squareit(3)
#> [1] 9
之後的「概念」單元中我們會看到,結果9其實是長度為 1 的向量,而不是純量數字。
因此才會出現[1],用來表示這是向量的開頭。
is.vector(9)
#> [1] TRUE
R 裡大多數東西都是某種向量!
R 主控台會把上面的範例顯示成:
> squareit(3)
[1] 9
這份課程大綱中的文件大多遵循幾本 R 教科書所用的慣例,移除提示字元並把結果註解起來。 這麼做可以更容易把程式碼範例複製貼上到主控台中執行。