代码之家  ›  专栏  ›  技术社区  ›  pietrodito

为什么tracemem在函数体内部修改时会显示两个副本?

  •  1
  • pietrodito  · 技术社区  · 6 年前

    R REPL内部:

    R version 3.6.1 (2019-07-05) -- "Action of the Toes"
    > foo <- function (x) x[[1]] <- 0
    > a <- 1L:3L
    > tracemem(a)
    [1] "<0x55d5470e4940>"
    > foo(a)
    tracemem[0x55d5470e4940 -> 0x55d545e11808]: foo 
    tracemem[0x55d545e11808 -> 0x55d5470050c8]: foo
    

    0 回复  |  直到 6 年前
        1
  •  0
  •   pietrodito    6 年前

    根据joran的评论:

    双拷贝与函数调用无关,但它是由整数向量转换成双向量引起的 b[[1]] <- 0 . 这里是相同的没有功能调用:

    > a <- 1L:3L
    > tracemem(a)
    [1] "<0x556c48022f70>"
    > b <- a
    > b[[1]] <- 0
    tracemem[0x556c48022f70 -> 0x556c46e1e788]: 
    tracemem[0x556c46e1e788 -> 0x556c48012118]: 
    

    而现在 b[[1]] <- 0L

    > a <- 1L:3L
    > tracemem(a)
    [1] "<0x556c480f3100>"
    > b <- a
    > b[[1]] <- 0L
    tracemem[0x556c480f3100 -> 0x556c46e1e908]: 
    >