:= 在多个环境中分配

:= assigning in multiple environments

我有两个数据表,我将它们加入了一个函数。我使用 := 重新分配一列的值,但它会在该函数和全局环境中更改该列的值(参见代码)

library(data.table)

# Example data
dt1 <- data.table(letters=letters[1:6],
                  value=1:6 + 0.0)
dt2 <- data.table(letters=c("b", "e"),
                  value=rnorm(2))

# Define a function so we perform := in separate environment
f <- function(df1, df2) {
  df1[df2, on="letters", value:=value-i.value]
}

# Run the function
f(dt1, dt2)

# Surprised to find it's updated dt1's value column
# despite dt1 being in a different environment
dt1

有没有办法让 := 只在使用它的环境中赋值?或者至少不会影响我工作的环境...

我们可以copy函数体中的对象,在通过引用修改它之前:

f <- function(df1, df2) {
  copy(df1)[df2, on="letters", value:=value-i.value]
}