我遇到了"[<-"种奇怪的行为.根据调用顺序以及我使用的是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在查询其结构之前没有时间"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相关问答推荐

根据特定列中的数据框条目添加新列的最快方法是什么

`magrittr` 管道进入应用

使用绘图时的轴范围

如果超过 R 中的长度,则对向量进行子集并检索第一个元素

根据 R 上的其他条目填充缺失值

从 CI 输出制作表格

如何做每列报告的最新值的新数据框?

在R中按组查找最长的值序列

Sum 具有相似名称的列

如何将字符串向量(每个都给出命令)转换为 R 中的函数?

调用堆栈的稳定性如何,特别是 -1?

如何在 R 中调整 plot_ly 绘图的大小

列出到 knitr 环境(在 R 块中使用 list2env 时出现 R-markdown 错误)

根据问题逻辑显示真实的未知数

如何根据值在矩阵上水平移动行

如何将列变成R中的列名

使用 R 在 map() 中更新循环外的向量

根据 dplyr 中的开始和停止日期生成新变量

如何更有效地使用 map_dfr() 过滤数据集?

在函数定义期间判断并保存参数变量值?