相关疑难解决方法(0)

向量上的复制修改语义不会附加到循环中.为什么?

这个问题听起来在这里得到了部分回答,但这对我来说还不够具体.当通过引用更新对象以及复制对象时,我想更好地理解.

更简单的例子是矢量增长.下面的代码在R中非常低效,因为在循环之前没有分配内存,并且在每次迭代时都进行了复制.

  x = runif(10)
  y = c() 

  for(i in 2:length(x))
    y = c(y, x[i] - x[i-1])
Run Code Online (Sandbox Code Playgroud)

分配内存使能保留一些内存,而无需在每次迭代时重新分配内存.因此,这个代码速度极快,特别是对于长向量.

  x = runif(10)
  y = numeric(length(x))

  for(i in 2:length(x))
    y[i] = x[i] - x[i-1]
Run Code Online (Sandbox Code Playgroud)

这是我的问题.实际上,当矢量更新时,它确实会移动.有一个副本,如下所示.

a = 1:10
pryr::tracemem(a)
[1] "<0xf34a268>"
a[1] <- 0L
tracemem[0xf34a268 -> 0x4ab0c3f8]:
a[3] <-0L
tracemem[0x4ab0c3f8 -> 0xf2b0a48]:  
Run Code Online (Sandbox Code Playgroud)

但在循环中,此副本不会发生

y = numeric(length(x))
for(i in 2:length(x))
{
   y[i] = x[i] - x[i-1]
   print(address(y))
}
Run Code Online (Sandbox Code Playgroud)

[1] "0xe849dc0"
[1] "0xe849dc0"
[1] "0xe849dc0"
[1] "0xe849dc0" …
Run Code Online (Sandbox Code Playgroud)

r pass-by-reference pass-by-value

9
推荐指数
2
解决办法
124
查看次数

标签 统计

pass-by-reference ×1

pass-by-value ×1

r ×1