基礎

基礎 在 R

1 個練習

關於 基礎

變數與賦值

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"
Advanced

你可能也會看到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 裡大多數東西都是某種向量!

Note

R 主控台會把上面的範例顯示成:

> squareit(3)
[1] 9

這份課程大綱中的文件大多遵循幾本 R 教科書所用的慣例,移除提示字元並把結果註解起來。 這麼做可以更容易把程式碼範例複製貼上到主控台中執行。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 基礎