【问题标题】:<-, [[<-, $<- and := with environments<-、[[<-、$<- 和 := 与环境
【发布时间】:2014-03-06 09:25:32
【问题描述】:

我很想知道 data.tablea 相对于环境的行为是否不一致。使用 data.tables 时,期望将新变量分配给 data.table 不会复制数据,而是创建指向现有表的新指针。当源 data.table 存在于另一个环境中时,这似乎不是真的。例如,

> attach( new.env(), name="dt" )
> e <- as.environment("dt")
> 
> assign( "mydata", data.table( x=1:3, y=1 ), e)
> mydata
   x y
1: 1 1
2: 2 1
3: 3 1
> ls()
[1] "e"       

如果我们尝试为mydata 分配一个新名称,我们不会得到指向相同数据的指针的预期行为。

mydata2 <- mydata     # also makes a _copy_
mydata2[['y']] <- 5   # change the data
identical( mydata2, mydata )  
> FALSE

mydata2 不指向(相同的值)mydata。它制作了一个副本。这不是我对 data.table 的期望。我希望 data.tables 表现得更像单例,其中只有一个数据副本存在,除非创建明确的 copy

此外,$&lt;-[[&lt;- 会导致在全局环境中进行复制。 $&lt;&lt;-[[&lt;&lt;- 没有(如预期的那样)。此外,:= 不会生成副本。

这是否与 data.table 的意图不一致?

这种行为是否与 data.table 不一致?

R 版本信息:

R.版本 _
平台 x86_64-unknown-linux-gnu
拱 x86_64
操作系统 linux-gnu
系统 x86_64, linux-gnu
状态
专业 3
次要 0.1
2013 年
05月
第 16 天
svn 版本 62743
语言 R
version.string R 版本 3.0.1 (2013-05-16) 昵称好运动

【问题讨论】:

  • &lt;-data.table 没有任何不同。您需要使用data.table 提供的:= 运算符和set* 函数通过引用来执行操作。另见stackoverflow.com/questions/10225098/…?":="。只要您使用:=set*,您的期望就是正确的。
  • 哦,我明白了。感谢您提供关于 DT 行为的清晰和指向先前答案的链接。我会说这种行为有点不一致/出乎意料,尽管我认识到这是您必须处理的限制。大包顺便说一句。

标签: r data.table


【解决方案1】:

&lt;-= 运算符在 R 中复制所有对象:

a = c(1:10)
.Internal(inspect(a))
#@0x000000001072aa28 13 INTSXP g0c4 [NAM(1)] (len=10, tl=0) 1,2,3,4,5,...
b = a
.Internal(inspect(b))
#@0x000000001072aa28 13 INTSXP g0c4 [NAM(2)] (len=10, tl=0) 1,2,3,4,5,...

当您执行mydata2 &lt;- mydata 时,您的mydata 也不会被复制(您可以使用上述方法再次检查,或者在分配后立即尝试mydata[, y := 5] 之类的方法并查看这如何更改两个表)。

另一方面,[[&lt;- 和大量其他赋值运算符为 data.framedata.table 进行复制(这就是您所看到的),通过引用修改 data.table 的方法是使用 @987654331 @。以上环境因素都不重要。

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2020-11-23
    相关资源
    最近更新 更多