【问题标题】: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)

【问题讨论】:

    标签: r function data.table pipe


    【解决方案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,特别是第一个答案
    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 2012-05-16
    • 2018-07-02
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    相关资源
    最近更新 更多