賦值(指派,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之值為5y之值為5
x <- y <- 5 x <- ( y <- 5 ) x之值為5y之值為5
x = y <- 5 x = ( y <- 5 ) x之值為5y之值為5
x <- y = 5 (x <- y ) = 5 Error in x <- y = 5 : object 'x' not found
x <- 5 -> y y <- 5x <- 5 x之值為5y之值為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

results matching ""

    No results matching ""