Подтвердить что ты не робот

Как подавить вывод при использовании `: =` в R {data.table}, до v1.8.3?

Есть ли способ предотвратить data.table для печати новой таблицы данных после присвоения нового столбца по ссылке? Я считаю, что стандартное поведение

library(data.table)
example(data.table)
DT
#    x y  v
# 1: a 1 42
# 2: a 3 42
# 3: a 6 42
# 4: b 1 11
# 5: b 3 11
# 6: b 6 11
# 7: c 1  7
# 8: c 3  8
# 9: c 6  9

DT[,z:=1:nrow(DT)]

#    x y  v z
# 1: a 1 42 1
# 2: a 3 42 2
# 3: a 6 42 3
# 4: b 1 11 4
# 5: b 3 11 5
# 6: b 6 11 6
# 7: c 1  7 7
# 8: c 3  8 8
# 9: c 6  9 9

то есть. после распечатки таблица выводится на экран. есть ли способ остановить data.table от показа новой таблицы после назначения нового столбца z? Я знаю, что могу остановить это поведение, сказав

DT <- copy(DT[,z:=1:nrow(DT)])

но это побеждает цель := (которая предназначена для исключения копий).

4b9b3361

Ответ 1

Так как <-.data.table не создает копию, вы можете использовать <-:

Создайте объект data.table:

library(data.table)
di <- data.table(iris)

Создайте новый столбец:

di <- di[, z:=1:nrow(di)]
di

#       Sepal.Length Sepal.Width Petal.Length Petal.Width Species  z
#  [1,]          5.1         3.5          1.4         0.2  setosa  1
#  [2,]          4.9         3.0          1.4         0.2  setosa  2
#  [3,]          4.7         3.2          1.3         0.2  setosa  3
#  [4,]          4.6         3.1          1.5         0.2  setosa  4
#  [5,]          5.0         3.6          1.4         0.2  setosa  5
#  [6,]          5.4         3.9          1.7         0.4  setosa  6
#  [7,]          4.6         3.4          1.4         0.3  setosa  7
#  [8,]          5.0         3.4          1.5         0.2  setosa  8
#  [9,]          4.4         2.9          1.4         0.2  setosa  9
# [10,]          4.9         3.1          1.5         0.1  setosa 10
# First 10 rows of 150 printed. 

Также стоит помнить, что R только печатает значение объекта в интерактивном режиме.

Итак, в пакетном режиме вы можете просто использовать:

di[, z:=1:nrow(di)]

Это не будет выдавать какой-либо вывод при запуске как script в пакетном режиме.


Дополнительная информация от Мэтью Доула:

Также см. часто задаваемые вопросы 2.21 и 2.22:

2.21 Почему DT[i,col:=value] возвращает все DT? Я ожидал либо никакого видимого значения (в соответствии с <-), либо сообщения или возвращаемого значения, содержащего, сколько строк было обновлено. Не очевидно, что данные действительно были обновлены по ссылке.

Так что сложный синтаксис может работать; например, DT[i,done:=TRUE][,sum(done)]. Число обновленных строк возвращается, когда многословие включено, либо на основе запроса, либо глобально, используя options(datatable.verbose=TRUE).

2.22 Хорошо, но нельзя вернуть возвращаемое значение DT[i,col:=value] невидимо, тогда?

  • Мы пытались, но R внутренне заставляет видимость для [. Значение Рейтинговая колонка FunTab (см. Src/main/names.c) для [ равна 0, что означает силу R_Visible on (см. раздел R-Internals 1.6). Поэтому, когда мы пытались invisible() или непосредственно установить R_Visible в 0, eval в src/main/eval.c снова запустит его.
  • После привыкания к этому поведению вы можете вырасти, чтобы предпочесть его (у нас есть). В конце концов, сколько раз мы переназначаем с помощью <-, а затем сразу же просматриваем данные, чтобы проверить это нормально?
  • Мы можем смешать := в j, который также возвращает данные; смешанное обновление и выбор в одном запросе. Чтобы определить, может ли j полностью обновляться (а затем вести себя неровно), может быть запутанным.

Второе обновление от Мэтью Доула:

Теперь мы нашли решение и v1.8.3 больше не печатает результат при использовании :=. Мы обновим часто задаваемые вопросы 2.21 и 2.22.