【发布时间】:2017-09-10 19:09:35
【问题描述】:
偶然我遇到了"[<-" 操作员的奇怪行为。它的行为取决于调用顺序以及我使用的是 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),情况看起来完全一样。
我知道“功能”版本 ("[<-"(x..)) 可能从未使用过,但我很好奇它为什么会发生。谁能解释一下?
===========================
编辑:
好的,所以我从 cmets 得知原因是 x <- 1:10 的类型为“整数”,而在替换 x[5] <- 123 后它是“双”。
但仍然存在疑问,为什么 RStudio 中的行为不同?我重新启动 R 会话,它没有改变任何东西。
【问题讨论】:
-
这可能值得一读stackoverflow.com/questions/15178507/…——但这不是同一个问题
-
plain old R是什么意思? -
这是一个疯狂的猜测,我不确定如何测试它,但在 mnel 链接到的问题中,指出如果有第二个对替换的对象的引用不会在原地完成,但会产生一个副本(因此不会修改原始变量)。也许 RStudio 作为其 GUI 的一部分,具有对该对象的引用。这是可能的,因为它有一个对象浏览器。或者触发复制机制而不是就地替换行为的其他方面。
-
我无法在 RStudio 和 RGUI(以及使用 Rterm 的 Eclipse)中重现这种相同的行为(顺序很重要)。
-
@Arun -- 作为马特的问题。也就是说,当您一次粘贴所有命令时,Rstudio 的对象浏览器没有机会“触摸”
x,其方式是将其named字段重置为2,直到发生子分配之后。您(或使用 Rstudio 的其他人)可以通过粘贴x <- 1:10; .Internal(inspect(x))来测试这一点,或者一次全部粘贴,或者一个一个粘贴。在第一种情况下,我希望看到[MARK,NAM(1)]和第二种[MARK,NAM(2)]。如果是这样,我认为这个谜团已经基本解决了。