在`dt2 <- dt %>% myfun`中,为啥要修改dt? [复制]

Posted

技术标签:

【中文标题】在`dt2 <- dt %>% myfun`中,为啥要修改dt? [复制]【英文标题】:In `dt2 <- dt %>% myfun`, why is dt modified? [duplicate]在`dt2 <- dt %>% myfun`中,为什么要修改dt? [复制] 【发布时间】:2021-07-02 13:04:08 【问题描述】:
library(tidyverse)
library(data.table)
dt <- data.table(x=1:3)
dt[x==1]
myfun <- function(d) d[x==1,x:=NA]
dt2 <- dt %>% myfun
dt[x==1]

在此示例中,dt(一个 data.table)作为参数通过管道发送给函数 (myfun)。然后将结果保存到对象 dt2 中。

为什么要修改dt? (如您所见,第 1 行中 x 的值从 1 变为 NA)

【问题讨论】:

【参考方案1】:

这是通过引用分配的分配:=。根据?:=

:= 定义为仅在 j 中使用。它通过引用添加或更新或删除列。它根本不复制内存的任何部分。 ... DT 被引用修改并无形返回。如果需要副本,请先复制(使用 DT2 = copy(DT))。

如果我们不想更改原始数据,请获取数据的copy 并使用该数据

dt1 <- data.table::copy(dt)

并使用“dt1”

【讨论】:

谢谢@akun。我了解:= 在函数中通过引用进行修改。出乎意料的是,这会修改函数外部的原始 dt(我猜这是 R 函数作用域的一个特性)。补充一下,问题的解决方案是:dt2 &lt;- dt %&gt;% copy %&gt;% myfun @LucasMation 如果我有一个 data.table,我会小心地在函数内部或外部对原始对象进行赋值 @LucasMation 你可能想检查this,特别是第一个答案

以上是关于在`dt2 <- dt %>% myfun`中,为啥要修改dt? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c# 该行已经属于另一个表

2个DataTable的合并问题!! 急!!!!!!!!!

pandas 记录

pandas 记录

pandas 处理数据时快捷方法

如何比较两个 DataTable 并返回差异?