賦值(指派,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