Ответ 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.