3.4.4 子集赋值

Keywords:

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...

special topic