賦值(指派,assignment)
指派意指將值賦予變項(名稱)。
| 運算子 | 說明 | 範例 | 
|---|---|---|
| = | 將右側的值指派予左側的變項,其範疇(Scope)較窄,常見於函式引數 | x = 5, f( x = 5 ) | 
| <- | 將右側的值指派予左側的變項,是一般最常見的使用方式 | x <- 5 | 
| -> | 將左側的值指派予右側的變項 | 5 -> x | 
| <<- | 將右側的值指派予左側的變項,通常在函式內使用,其範疇可達親環境(Parent Environment) | x <<- 5 | 
| ->> | 將左側的值指派予右側的變項,通常在函式內使用,其範疇可達親環境(Parent Environment) | 5 ->> x | 
上表中第一種方式,是單向的,只能將右側的值指派給左側的變項,不能將左側的值指派給右側的變項。
> rm(x) # 移除環境中的 x 物件。
> 5 = x # 「逆向」指派會發生錯誤。
Error in 5 = x : invalid (do_set) left-hand side to assignment
上表中第一種方式=與第二、三種方式<-、->的不同之處,舉例如下。
> rm(x) # 移除環境中的 x 物件。
> # 使用上表第一種方式,x 只被定義 print() 的範疇內,
> # 此例中等號的角色為引數傳遞運算子(Argument Passing Operator),
> # 發揮不出指派運算子(Assignment Operator)的效果。
> print(x = 5) 
[1] 5
> x # 查看 x 內容,由於該變項未在全域環境中定義,因此找不到。
Error: object 'x' not found
> 
> print(x <- 5) # 使用上表第二種方式。
[1] 5
> x # 查看 x 內容,因 x 的作用及於 print() 的範疇外,故找得到。
[1] 5
> rm(x) # 將定義過的 x 給移除掉。
> 
> print(5 -> x) # 使用上表第三種方式。
[1] 5
> x # 查看 x 內容,因 x 的作用及於 print() 的範疇外,故找得到。
[1] 5
> rm(x) # 將定義過的 x 給移除掉。
>
> # 第一種方式所產生的錯誤,可藉由加上()或{}來解決,即(x = 5)或{x = 5},如:
> print((x = 5))
[1] 5
> x
[1] 5
> rm(x) # 將定義過的 x 給移除掉。
> print({x = 5})
[1] 5
> x
[1] 5
除了使用的範疇不同之外,優先權(Precedence)也不相同,->與<-較高,而=較低。
| 陳述 | 運算 | 結果 | 
|---|---|---|
x = y = 5 | 
x = ( y = 5 ) | 
x之值為5、y之值為5 | 
x <- y <- 5 | 
x <- ( y <- 5 ) | 
x之值為5、y之值為5 | 
x = y <- 5 | 
x = ( y <- 5 ) | 
x之值為5、y之值為5 | 
x <- y = 5 | 
(x <- y ) = 5 | 
Error in x <- y = 5 : object 'x' not found | 
x <- 5 -> y | 
y <- 5、x <- 5 | 
x之值為5、y之值為5 | 
5 -> x <- 6 | 
(x <- 5) <- 6 | 
Error in (x <- 5) <- 6 : object 'x' not found  | 
在使用<-時應養成二符號字元緊靠在一起並將前後留白的習慣,以避免以下的情形發生:
> x <- 5 # 將 5 這個值指派予 x 變項。
> x < -5 # 測試 x 是否小於 -5 這個值,由於 x 的值為 5,故得到否定答案。
[1] FALSE