3.4.4 子集赋值
Previous: Indexing other structures,Up: Indexing
3.4.4 子集赋值
x[3:5] <- 13:15
该命令的结果就像执行了下面的代码
`*tmp*` <- x
x <- "[<-"(`*tmp*`,3:5, value=13:15)
这样的机制可用于其它函数,而不仅仅是 [。赋值函数和前面贴的 <- 有一样的名字。它的最后一个名为 value 的参数是将被分配的新值。
names(x) <- c("a","b")
等价于
`*tmp*` <- x
x <- "names<-"(`*tmp*`, value=c("a","b"))
嵌套复合赋值的可以递归求值
names(x)[3] <- "Three"
等价于
`*tmp*` <- x
x <- "names<-"(`*tmp*`, value="[<-"(names(`*tmp*`), 3, value="Three"))
在外围环境中的复合赋值(用<<-)也是允许的:
names(x)[3] <<- "Three"
等价于
`*tmp*` <<- get(x, envir=parent.env(), inherits=TRUE)
names(`*tmp*`)[3] <- "Three"
x <<- `*tmp*`
也等价于
`*tmp*` <- get(x,envir=parent.env(), inherits=TRUE)
x <<- "names<-"(`*tmp*`, value="[<-"(names(`*tmp*`), 3, value="Three"))
在外围环境中,仅仅目标变量被求值,因此
e<-c(a=1,b=2)
i<-1
local({
e <- c(A=10,B=11)
i <-2
e[i] <<- e[i]+1
})
在 LHS 和 RHS 中使用i的局部值,在超赋值语句(superassignment statement)的 RHS 中使用e的局部值。在环境外把e 的值设为
a b
1 12
也就是说,超赋值等价于下面三行
`*tmp*` <- get(x,envir=parent.env(), inherits=TRUE)
`*tmp*`[i] <- e[i]+1
x <<- `*tmp*`
类似的是
x[is.na(x)] <<- 0
等价于
`*tmp*` <- get(x,envir=parent.env(), inherits=TRUE)
`*tmp*`[is.na(x)] <- 0
x <<- `*tmp*`
但与下面的代码不一样
`*tmp*` <- get(x,envir=parent.env(), inherits=TRUE)
`*tmp*`[is.na(`*tmp*`)] <- 0
x <<- `*tmp*`
这两种解释的差异仅仅在于是否有一个局部变量 x。应该尽量避免一个局部变量名字和一个超赋值的目标变量名字一样。因为这种情况在1.9.1版本或者之前的版本不能正常处理,所以没有必要采用这些代码。
Hits:Loading...
- Previous Page: 3.4.3 其它结构的索引操作
- Next Page: 3.5 变量作用域
