: = назначение в нескольких средах - PullRequest
0 голосов
/ 26 мая 2020

У меня есть две таблицы данных, которые я оставил объединенными в функцию. Я переназначаю значения одного столбца, используя :=, но он меняет значение этого столбца как в этой функции, так и в глобальной среде (см. Код)

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

Есть ли способ получить := назначать только в той среде, в которой он используется? Или, по крайней мере, это не повлияет на среду, в которой я работаю ...

1 Ответ

1 голос
/ 26 мая 2020

Мы могли бы copy объект в теле функции, прежде чем изменять его по ссылке:

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