Почему эта переменная датафрейма принимает атрибут, а не присвоенную ей степень детализации?(Dplyr-R), - PullRequest
0 голосов
/ 18 декабря 2018

Любопытно: может ли кто-нибудь объяснить, почему df1 и df3 наконец-то присваивается один и тот же атрибут, хотя df3 явно модифицирован?Я бы предположил, что, поскольку df1 и df3 имеют разные адреса памяти, они не будут оба модифицированы.Проблема трубопровода - Как объекты связаны друг с другом?

library(lobstr)
library(dplyr)
library(data.table)

df1 <- data.frame(x = 1:3, y = letters[1:3])
df2<-data.frame(df1)

df3<-df2%>% dplyr::mutate_at(vars(ends_with("x")),
                   funs(data.table::setattr(.,"label","An x column")))

str(df1)
str(df3)

obj_addr(df1)
obj_addr(df3)

Результаты

 str(df1)
'data.frame':   3 obs. of  2 variables:
 $ x: int  1 2 3
 ..- attr(*, "label")= chr "An x column"
 $ y: Factor w/ 3 levels "a","b","c": 1 2 3
str(df3)
'data.frame':   3 obs. of  2 variables:
 $ x: int  1 2 3
 ..- attr(*, "label")= chr "An x column"
$ y: Factor w/ 3 levels "a","b","c": 1 2 3

obj_addr(df1)
[1] "0xafe6a98"
obj_addr(df3)
[1] "0x98deef0"

1 Ответ

0 голосов
/ 18 декабря 2018

В соответствии с документацией для setattr:

В data.table все функции set * изменяют свой ввод по ссылке.То есть, копия не создается вообще, кроме временной рабочей памяти, размер которой составляет один столбец.Единственный другой оператор data.table, который изменяет ввод по ссылке: =.Ознакомьтесь с разделом «См. Также» ниже, чтобы узнать о другой функции set *, которую предоставляет data.table.

Если вы хотите указать атрибуты с обычной семантикой копирования при изменении, вы можете использовать structure:

df3 <- df2 %>% 
  dplyr::mutate_at(vars(ends_with("x")), funs(structure(., label = "An x column")))
...