作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 '[<-'
时注意到以下内容.我成功地替换了元素,但没有成功地将元素附加到向量中。
例子:
VarX <- integer()
VarX[1] <- 11
`[<-`(VarX, 2, 22)
VarX
# [1] 11
# Expected the value of VarX to be:
# [1] 11 22
# Also tried:
`[<-`(VarX, i=2, value=22)
VarX
# [1] 11
VarX <- integer()
VarX[1] <- 11
VarX[2] <- 99
VarX
# [1] 11 99
`[<-`(VarX, 2, 22)
VarX
# [1] 11 22
VarX
是
1:2
与
c(1, 2)
的行为[<-
(VarX, 2, 22)
给出不同的结果,如下图:
rm(VarX) # actually ran: rm(list=ls(all=TRUE))
VarX <- 1:2
VarX
# [1] 1 2
`[<-`(VarX, 2, 22)
# [1] 1 22
VarX
# [1] 1 2
rm(VarX) # actually ran: rm(list=ls(all=TRUE))
VarX <- c(1, 2)
VarX[2] <- 2
VarX
# [1] 1 2
`[<-`(VarX, 2, 22)
# [1] 1 22
VarX
# [1] 1 22
> sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
最佳答案
函数'[<-'
可能不会替换其第一个参数中的任何内容。在某些情况下,它会复制对象并修改它。
请参阅语言定义的第 3.4.4 节:
x[3:5] <- 13:15
The result of this commands is as if the following had been executed
‘*tmp*‘ <- x
x <- "[<-"(‘*tmp*‘, 3:5, value=13:15)
rm(‘*tmp*‘)
x
的结构,这基本上是将运行的。必须修改。但是,根据 OP(以及其他人,包括我自己)的实验,很明显
"[<-"
函数可以就地修改元素。显然,如果要替换整个对象,则无法就地完成任何操作。
> x <- 1:2
> class(x)
[1] "integer"
> `[<-`(x, 2, 99L)
[1] 1 99
> x
[1] 1 99
C
函数
SubAssignTypeFix
中):
> x <- 1:2
> class(x)
[1] "integer"
> x[2] <- 99
> class(x)
[1] "numeric"
x <- 1:2
y <- x
`[<-`(x, 2, 99L)
## [1] 1 99
x
## [1] 1 2
x[2] <- 99
间接调用的赋值函数调用
C
功能
do_set
,而当直接按名称调用赋值函数时,不会调用此函数。
do_set
调用函数
defineVar
这会修改适当的环境。在就地替换的情况下,对象在环境中替换自身,这正是按名称调用赋值函数导致对象被修改(未获取副本)的确切情况。
#### R console:
x <- 1:2
.Internal(inspect(x))
## @26b27a8 13 INTSXP g0c1 [NAM(1)] (len=2, tl=0) 1,2
x[2] <- 99
#### gdb:
Breakpoint 7, do_set (call=0x2773640, op=0x169e668, args=0x2773870, rho=0x16c6b68) at eval.c:1732
(gdb) p s
## $135 = (SEXP) 0x192bee0
c
#### R console:
.Internal(inspect(x))
## @192bee0 14 REALSXP g0c2 [NAM(1)] (len=2, tl=0) 1,99
[<-
放大矢量,复制一份。来自函数
EnlargeVector
在
subassign.c:113
:
PROTECT(newx = allocVector(TYPEOF(x), newlen));
/* Copy the elements into place. */
...
关于r - 函数 `[<-` 将 _replace_ 一个元素,但不附加一个 _element_,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15178507/
我在使用 '[ sessionInfo() R version 2.15.1 (2012-06-22) Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bi
我是一名优秀的程序员,十分优秀!