在`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 <- dt %>% copy %>% myfun
@LucasMation 如果我有一个 data.table,我会小心地在函数内部或外部对原始对象进行赋值
@LucasMation 你可能想检查this,特别是第一个答案以上是关于在`dt2 <- dt %>% myfun`中,为啥要修改dt? [复制]的主要内容,如果未能解决你的问题,请参考以下文章