相关疑难解决方法(0)

R中的copy-on-modify语义到底是什么,以及规范源在哪里?

每隔一段时间我就会遇到R具有复制修改语义的概念,例如在Hadley的devtools wiki中.

大多数R对象具有复制修改语义,因此修改函数参数不会更改原始值

我可以将这个术语追溯到R-Help邮件列表.例如,Peter Dalgaard在20037月写道:

R是一种函数式语言,具有惰性求值和弱动态类型(变量可以随意更改类型:a < - 1; a < - "a"是允许的).从语义上讲,一切都是复制修改,尽管在实现中使用了一些优化技巧来避免最严重的低效率.

同样,Peter Dalgaard在20041月写道:

R具有复制修改语义(原则上,有时在实践中),因此一旦对象的一部分发生变化,您可能必须在新的位置查找包含它的任何内容,包括可能的对象本身.

更进一步,20002月, Ross Ihaka说:

我们付出了相当多的努力来实现这一目标.我会将语义描述为"复制修改(如有必要)".仅在修改对象时才进行复制.(如果需要)部分意味着如果我们可以证明修改不能改变任何非局部变量,那么我们就可以继续修改而不需要复制.

它不在手册中

无论我搜索多么努力,我都无法在R手册中找到"复制修改"的参考,无论是在R语言定义还是在R Internals中

我的问题有两个部分:

  1. 这在哪里正式记录?
  2. 复制修改如何工作?

例如,谈论"传递引用"是否合适,因为承诺传递给函数?

r pass-by-reference pass-by-value

71
推荐指数
2
解决办法
6008
查看次数

运算符"[< - "在RStudio和R中

偶然我遇到了"[<-"操作员的奇怪行为.它的行为会有所不同,具体取决于调用的顺序以及我是使用RStudio还是普通的RGui.我将通过一个例子说清楚.

x <- 1:10
"[<-"(x, 1, 111)
x[5] <- 123
Run Code Online (Sandbox Code Playgroud)

据我所知,第一个分配不应该改变x(或者我可能是错的?),而第二个应该这样做.事实上,上述操作的结果是

x
[1]  1  2  3  4  123  6  7  8  9 10
Run Code Online (Sandbox Code Playgroud)

但是,当我们以不同的顺序执行这些操作时,结果会有所不同并且x已经发生变化!意味深长:

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

但它只发生在我使用普通R!在RStudio中,两个选项的行为都是相同的.我在两台机器上检查过它(一台用Fedora,一台用Win7),情况看起来完全一样.我知道'功能'版本("[<-"(x..))可能从未使用过,但我很好奇它为什么会发生.谁能解释一下呢?

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

编辑:好的,所以从评论我得到的原因是x <- 1:10类型'整数'和更换后x[5] <- 123的'双'.但仍然存在为什么RStudio的行为不同的问题?我重新启动R会话,它不会改变任何东西.

r rstudio

42
推荐指数
1
解决办法
1391
查看次数

替换元素时避免复制整个向量(a [1] < - 2)

替换矢量中的元素时

a <- 1:1000000
a[1] <- 2
Run Code Online (Sandbox Code Playgroud)

R复制整个向量,替换新向量中的元素,然后执行变量名称重新关联.我想知道无论如何要覆盖或阻止它使它的行为更像c数组?

谢谢

r

10
推荐指数
2
解决办法
862
查看次数

标签 统计

r ×3

pass-by-reference ×1

pass-by-value ×1

rstudio ×1