通过引用对R中的向量进行子分配 [英] Sub-assign by reference on vector in R

查看:143
本文介绍了通过引用对R中的向量进行子分配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以通过引用对子原子向量进行子分配吗?

当然不能在1列data.table中使用:=

Can I use sub-assign by reference on atomic vectors somehow?
Of course without wrapping it in 1 column data.table to use :=.

library(data.table)
N <- 5e7
x <- sample(letters, N, TRUE)
X <- data.table(x = x)
upd_i <- sample(N, 1L, FALSE)
system.time(x[upd_i] <- NA_character_)
#    user  system elapsed 
#    0.11    0.06    0.17 
system.time(X[upd_i, x := NA_character_])
#    user  system elapsed 
#    0.00    0.00    0.03 

R6可以帮助我开放R6解决方案,因为它是我的一个已经。

我已经检查了< - R6 对象仍会复制: gist

If R6 can help on that I'm open for R6 solution as it is one of my dep already.
I've already checked that <- inside R6 object still makes copy: gist.

推荐答案

在最新的R版本(3.1-3.1.2 +左右)中,向量的赋值不会被复制。你不会看到通过运行OP的代码,而原因是以下。因为你重用 x 并将其分配给某个其他对象,R不会通知在该点复制了 x 并且必须假设它不会(在上面的特定情况下,我认为它会是好的改变在 data.table :: data.table 和通知R已经进行了复制,但这是一个单独的问题 - data.frame 遭受同样的问题),因为它复制 x 第一次使用。如果您稍微改变命令的顺序,您会看到没有区别:

In most recent R versions (3.1-3.1.2+ or so), assignment to a vector does not copy. You will not see that by running OP's code though, and the reason for that is the following. Because you reuse x and assign it to some other object, R is not notified that x is copied at that point, and has to assume that it won't be (in the particular case above, I think it'll be good to change it in data.table::data.table and notify R that a copy has been made, but that's a separate issue - data.frame suffers from same issue), and because of that it copies x on first use. If you change the order of the commands a bit, you'd see no difference:

N <- 5e7
x <- sample(letters, N, TRUE)
upd_i <- sample(N, 1L, FALSE)
# no copy here:
system.time(x[upd_i] <- NA_character_)
#   user  system elapsed 
#      0       0       0 
X <- data.table(x = x)
system.time(X[upd_i, x := NA_character_])
#   user  system elapsed 
#      0       0       0 

# but now R will copy:
system.time(x[upd_i] <- NA_character_)
#   user  system elapsed 
#   0.28    0.08    0.36 






(旧答案,大多留作为好奇)


(old answer, mostly left as a curiosity)

你实际上可以使用 data.table := 运算符修改你的矢量到位(我认为你需要R版本3.1+避免在列表):

You actually can use the data.table := operator to modify your vector in place (I think you need R version 3.1+ to avoid the copy in list):

modify.vector = function (v, idx, value) setDT(list(v))[idx, V1 := value]

v = 1:5
address(v)
#[1] "000000002CC7AC48"

modify.vector(v, 4, 10)
v
#[1]  1  2  3 10  5

address(v)
#[1] "000000002CC7AC48"

这篇关于通过引用对R中的向量进行子分配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆