r - := (pass by reference) operator in the data. 表包同时修改另一个数据表对象

标签 r pass-by-reference data.table

在测试我的代码时,我发现了以下内容:如果我分配了一个 data.table DT1DT并更改 DT之后,DT1随之改变。所以DTDT1好像有内在联系。这是预期的行为吗?虽然我不是编程专家,但这对我来说似乎是错误的,并使用简单的 R 变量或 data.frame 对其进行测试。 ,我无法重现该行为。这里发生了什么事?

DF <- data.frame(ID=letters[1:5],
                  value=1:5)
DF1 <- DF
all.equal(DF1, DF)
[1] TRUE
DF[1, "value"] <- DF[1, "value"]*2
all.equal(DF1, DF)
[1] "Component 2: Mean relative difference: 1"

library(data.table)
data.table 1.7.1  For help type: help("data.table")
DT <- data.table(ID=letters[1:5],
                  value=1:5)
DT1 <- DT
all.equal(DT1, DT)
[1] TRUE
DT[, value:=value*2]
     ID value
[1,]  a     2
[2,]  b     4
[3,]  c     6
[4,]  d     8
[5,]  e    10
all.equal(DT1, DT)
[1] TRUE

最佳答案

这篇文档在data.table有助于。 ? data.table::copy

No value is returned. The data.table is modified by reference. If you require a copy, take a copy first (using DT2=copy(DT)). copy() may also sometimes be useful before := is used to subassign to a column by reference.

关于r - := (pass by reference) operator in the data. 表包同时修改另一个数据表对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8030452/

相关文章:

r - 准确理解何时 data.table 是对另一个 data.table 的引用(而不是其副本)

r - 将 dplyr join 语法转换为纯 data.table 语法

r - Tidyverse 和 R : how to count rows in a tibble of a nested dataframe

java - 在 RHEL 6 上安装 R R-java-devel 需要 java-devel

c++ - 什么时候通过引用在另一个 lambda 中捕获一个 lambda 是安全的?

php - 为什么我会收到 "Only variables should be passed by reference"错误?

c++ - 从 lambda 捕获有效变量

r - 计算 data.table 中满足条件的行数

r - 使用 dplyr group_by : return a list of data frames 模拟 split()

r - 如何使用 Shiny 的传单将多段线从一个位置分别添加到其他位置?