R/R賦值符小結
外觀
< R
->和<-、->>和<<-的區別
[編輯]- ->和<-、->>和<<-的區別是賦值方向,->、->>從左向右賦值,<-、<<-、=從右向左賦值
- ->、<-和->>、<<-的區別在於作用域範圍,->>、<<-是全局作用域,而->、<-是聲明局部(函數內部)作用域,下面舉個例子
# 声明一个函数
new_counter <- function() {
# 初始化两个变量值为0
i <- 0
j <- 0
function() {
# 分别使用<-和<<-进行自加运算
i <<- i + 1
j <- j + 1
# 打印两个变量
print(i)
print(j)
}
}
通過該函數來探索<-和<<-的區別
# 声明一个函数对象
> counter <- new_counter()
# 第一次执行,结果都为1
> counter()
[1] 1
[1] 1
# <<-赋值的变量值为2,<-赋值的变量值仍为1
> counter()
[1] 2
[1] 1
> counter()
[1] 3
[1] 1
> counter()
[1] 4
[1] 1
......
<-和=的區別
[編輯]- 在命令行賦值時沒有太大區別
> x <- cbind(a = 1:3, pi = pi)
> x
a pi
[1,] 1 3.141593
[2,] 2 3.141593
[3,] 3 3.141593
> x[1,1]<- 2
> x[2,1]=3
> x
a pi
[1,] 2 3.141593
[2,] 3 3.141593
[3,] 3 3.141593
- <-創建的變量的作用域是全局,而=僅僅在一個局部環境。 第一個例子:
> rm(x)
> mean(x=1:10)
[1] 5.5
> x
Error: object 'x' not found
> mean(x <- 1:10)
[1] 5.5
> x
[1] 1 2 3 4 5 6 7 8 9 10
第二個例子:
# 删除当前环境下的nrow对象
> rm(nrow)
# 使用<-赋值声明一个矩阵
> matrix(1,nrow<-2)
[,1]
[1,] 1
[2,] 1
# 查看当前的nrow值
> nrow
[1] 2
# 删除当前环境下的nrow对象
> rm(nrow)
# 使用=赋值声明一个矩阵
> matrix(1,nrow=2)
[,1]
[1,] 1
[2,] 1
# 此时nrow没有被赋值,显示的是R语言自带的nrow函数
> nrow
standardGeneric for "nrow" defined from package "base"
function (x)
standardGeneric("nrow")
<environment: 0x7fa98c7dc2a8>
Methods may be defined for arguments: x
Use showMethods("nrow") for currently available ones.
第三個例子:
> l <- list(x<-9, y=10)
> x
[1] 9
> y
Error: object 'y' not found
# 可以通过$富豪引用局部变量
> l$y
[1] 10
當在函數中,將實參通過<-傳遞給形參時,會在當前環境中創建一個以形參為名的變量,前提是該形式參數在函數體內部被調用。
# 将a赋值为1
> a <- 1
# 生成一个函数,设置该函数的形式参数名为a,
# 注意函数体内未调用形参啊
> f <- function(a) return(TRUE)
# 将a+1作为实际参数赋值给形式参数a
> f <- f(a <- a + 1);
# a <- a + 1没有被执行,a的值并没有变化
> a
[1] 1
> f
[1] TRUE
# 声明一个函数,注意函数体内调用形式参数a
> f <- function(a) return(a)
# 将a+1作为实际参数赋值给形式参数a
> f <- f(a <- a + 1);
# a <- a + 1被执行,a值改变
> a
[1] 2
總結
[編輯]- 多數使用<-,但當給函數參數傳值、通過函數創建不同對象及對行/列/屬性命名的時候用=
- 使用list函數創建列表後,在函數參數傳遞時使用=賦值,可以使用生成的list對象$形參名查看
- 如果在函數傳值使用->,可能會覆蓋與當前環境中與行參同名的變量,還會造成當前環境變量的混亂
- <<-和>>-一般用不到
參考文獻
[編輯]- https://stackoverflow.com/questions/6140694/is-there-a-technical-difference-between-and
- https://www.r-bloggers.com/assignment-operators-in-r-%E2%80%98%E2%80%99-vs-%E2%80%98-%E2%80%99/
- https://renkun.me/2014/01/28/difference-between-assignment-operators-in-r/
- https://stackoverflow.com/questions/2271575/whats-the-difference-between-and-in-r
- https://www.cnblogs.com/xuanlvshu/p/5493222.html