r - 如何在 j 运算符 (:=) 中使用通过引用链接来影响基础表
问题描述
我在这里有以下一段代码作为测试
library(data.table)
set.seed(1)
dt <- data.table::data.table(letters = sample(LETTERS,200,replace = TRUE),numbers = sample(1:1000,200,replace = TRUE))
sortcols <- c("letters","numbers")
setkeyv(dt,sortcols)
dt
# letters numbers
# 1: A 258
# 2: A 400
# 3: A 429
# 4: A 496
# 5: B 72
# ---
#196: Z 142
#197: Z 462
#198: Z 583
#199: Z 665
#200: Z 954
dt[letters=="A"][,numbers := numbers/2]
dt2 <- dt[letters=="A"][,numbers := numbers/2]
dt[letters=="A"]
# letters numbers
#1: A 258
#2: A 400
#3: A 429
#4: A 496
dt2
# letters numbers
#1: A 129.0
#2: A 200.0
#3: A 214.5
#4: A 248.0
我想在这里理解的是
- 为什么按引用运算符 := 在这里使用喜欢
dt[letters=="A"][,numbers := numbers/2]
不影响基础数据表 dt(并且所有字母 =="A" 的数字列保持不变),而当我将其复制为 dt2 时,它会反映在复制的结果中(即 dt2 中的数字列所有字母==“A”都被除以 2,这是代码的初衷)。引用运算符 := 的功能不是影响底层数据表而不进行复制吗?
- 是否可以不复制数据表并仍然使用链接和 := 来完成我想要完成的任务?
解决方案
推荐阅读
- python - 为 PyQt5 QtWebEngineWidgets 配置 Eclipse 和 PyDev?
- angular - 单击时触发角度动画
- r - 将年和周列转换为月 R
- angular - 获取数组中的前一个图像
- css - 实际上,抑制包装伪元素
- ruby-on-rails - 如何在客户端而不是在表单提交时触发文件上传?
- java - Firebase 电子邮件和密码身份验证失败 mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener((task)
- python - python中的Diffie-Hellman加密方案
- fiddler - 通过提琴手生成顺序 POST 请求
- python - Python defaultdict 深度嵌套数据结构