我遇到了"[<-"种奇怪的行为.根据调用顺序以及我使用的是RStudio还是普通RGui,它的行为会有所不同.我将用一个例子来说明我自己.

x <- 1:10
"[<-"(x, 1, 111)
x[5] <- 123

据我所知,初审不应该改变x(或者也许我错了?),而第二个应该可以.事实上,上述操作的结果是

x
[1]  1  2  3  4  123  6  7  8  9 10

然而,当我们以不同的顺序执行这些操作时,结果是不同的,x已经改变了!意味深长地说:

x <- 1:10
x[5] <- 123
"[<-"(x, 1, 111)
x
[1] 111   2   3   4   123   6   7   8   9  10

但这只发生在我使用纯R的时候!在RStudio中,两个选项的行为都是相同的.我在两台机器上判断过(一台是Fedora,另一台是Win7),情况看起来完全一样.

==========================

编辑:

推荐答案

Rstudio的行为

Rstudio的对象浏览器修改它所判断的对象时,会在修改时强制进行复制.具体地说,对象浏览器使用至少一个R函数,在将对象的named字段的值从1重置为2的过程中,该函数的调用在内部强制对对象进行判断.从R-Internals manual人中:

当一个对象即将被更改时,将参考命名字段.值为2表示在更改对象之前必须复制该对象.[...] 值1用于情况[…]原则上,计算期间存在两份副本[…]但不再是了,所以一些基本函数可以优化,以避免在这种情况下复制.

要查看对象浏览器修改named字段(下一个代码块中为[NAM()]),请比较运行以下行的结果.在第一种情况下,两条"线"一起运行,因此Rstudio在查询其 struct 之前没有时间"touch "X.在第二种情况下,每一行都是单独粘贴的,因此在判断之前对X进行了修改.

## Pasted in together
x <- 1:10; .Internal(inspect(x))
# @46b47b8 13 INTSXP g0c4 [NAM(1)] (len=10, tl=0) 1,2,3,4,5,...

## Pasted in with some delay between lines
x <- 1:10
.Internal(inspect(x))
# @42111b8 13 INTSXP g0c4 [NAM(2)] (len=10, tl=0) 1,2,3,4,5,... 

一旦named字段设置为2,[<-(X, ...)将不会修改原始对象.将以下内容一次性粘贴到Rstudio中会修改X,而将其逐行粘贴则不会:

x <- 1:10
"[<-"(x, 1, 111)

所有这一切的另一个后果是,Rstudio的对象浏览器实际上使一些操作比其他情况下要慢.再次比较两个相同的命令,先粘贴在一起,然后一次一个:

## Pasted in together
x <- 1:5e7
system.time(x[1] <- 9L)
#    user  system elapsed 
#       0       0       0 

## Pasted in one at a time
x <- 1:5e7
system.time(x[1] <- 9L)
#    user  system elapsed 
#    0.11    0.04    0.16 

Variable behavior of [<- in R

[<- w.r.t.修改向量X的行为取决于X的存储类型以及分配给它的元素的类型.这解释了R的行为,但不是Rstudio的行为.

在R中,当[<-附加到向量X,或执行要求修改X类型的子分配时,X被复制,并且返回的值不会覆盖预先存在的变量X.(要做到这一点,你需要做X <- "[<-(X, 2, 100)之类的事情.

So, neither of the following modify X

X <- 1:2         ## Note: typeof(X) --> "integer"

## Subassignment that requires that X be coerced to "numeric" type
"[<-"(X, 2, 100) ## Note: typeof(100) --> "numeric"
X 
# [1]   1   2

## Appending to X
"[<-"(X, 3, 100L)
X
# [1]   1   2

不过,只要有可能,R确实允许[<-函数通过引用直接修改X(即不制作副本).这里的"可能"包括子赋值不需要修改X类型的情况.

So all of the following modify X

X <- c(0i, 0i, 0i, 0i)
"[<-"(X, 1, TRUE)
"[<-"(X, 2, 20L)
"[<-"(X, 3, 3.14)
"[<-"(X, 4, 5+5i)
X
# [1]  1.00+0i 20.00+0i  3.14+0i  5.00+5i

R相关问答推荐

寻找图片边缘

使用R的序列覆盖

为什么st_join(ob1,ob2,left = True)返回具有比ob1更多功能的sf对象?

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

查找图下的面积

如何在kableextra调用cell_spec()中忽略NA?

如何在所有绘图中保持条件值的 colored颜色 相同?

有效识别长载体中的高/低命中

如何对2个列表元素的所有组合进行操作?

使用rvest从多个页面抓取时避免404错误

用两种 colored颜色 填充方框图

从多个可选列中选取一个值到一个新列中

根据约束随机填充向量的元素

在R中的数据框上使用Apply()函数时,如何保留非数字列?

`-`是否也用于数据帧,有时使用引用调用?

按两个因素将观测值分组后计算单独的百分比

将CSV转换为R中的自定义JSON格式

R中的交叉表

如何在给定的环境中找到函数的函数参数?

As.Date()不适用于5月或10月日期