объекты data.table, назначенные с помощью: = изнутри функции не распечатаны
Я хотел бы изменить data.table
внутри функции. Если я использую функцию :=
внутри функции, результат будет напечатан только для второго вызова.
Посмотрите на следующую иллюстрацию:
library(data.table)
mydt <- data.table(x = 1:3, y = 5:7)
myfunction <- function(dt) {
dt[, z := y - x]
dt
}
Когда я вызываю только функцию, таблица не печатается (это стандартное поведение. Однако, если я сохраню возвращенный data.table
в новый объект, он не будет напечатан при первом вызове, только для второго один.
myfunction(mydt) # nothing is printed
result <- myfunction(mydt)
result # nothing is printed
result # for the second time, the result is printed
mydt
# x y z
# 1: 1 5 4
# 2: 2 6 4
# 3: 3 7 4
Не могли бы вы объяснить, почему это происходит и как его предотвратить?
Ответы
Ответ 1
Как упоминает Дэвид Аренбург в комментарии, ответ можно найти здесь. В версии 1.9.6 была исправлена ошибка, но исправление внесло этот недостаток.
Чтобы предотвратить это, нужно вызвать DT[]
в конце функции.
myfunction <- function(dt) {
dt[, z := y - x][]
}
myfunction(mydt) # prints immediately
# x y z
# 1: 1 5 4
# 2: 2 6 4
# 3: 3 7 4
Ответ 2
Извините, если я не должен публиковать что-то здесь,
ответ, но мой пост слишком длинный для комментария.
Я хотел бы указать, что janosdivenyi решение добавить
trailing []
to dt
не всегда дает ожидаемые результаты (даже
при использовании данных. таблица 1.9.6 или 1.10.4), как я делаю ниже.
Приведенные ниже примеры показывают, что если dt
- последняя строка в функции
человек получает желаемое поведение без присутствия
trailing []
, но если dt
не находится в последней строке в функции, тогда
для получения желаемого поведения требуется конечный []
.
Первый пример показывает, что без конечного []
on dt
мы получаем
ожидаемое поведение, когда dt
находится в последней строке функции
mydt <- data.table(x = 1:3, y = 5:7)
myfunction <- function(dt) {
df <- 1
dt[, z := y - x]
}
myfunction(mydt) # Nothing printed as expected
mydt # Content printed as desired
## x y z
## 1: 1 5 4
## 2: 2 6 4
## 3: 3 7 4
Добавление конечного []
в dt
дает неожиданное поведение
mydt <- data.table(x = 1:3, y = 5:7)
myfunction <- function(dt) {
df <- 1
dt[, z := y - x][]
}
myfunction(mydt) # Content printed unexpectedly
## x y z
## 1: 1 5 4
## 2: 2 6 4
## 3: 3 7 4
mydt # Content printed as desired
## x y z
## 1: 1 5 4
## 2: 2 6 4
## 3: 3 7 4
Перемещение df <- 1
на после dt без конечного []
дает неожиданный
Поведение
mydt <- data.table(x = 1:3, y = 5:7)
myfunction <- function(dt) {
dt[, z := y - x]
df <- 1
}
myfunction(mydt) # Nothing printed as expected
mydt # Nothing printed unexpectedly
Перемещение df <- 1
после dt с завершающим []
дает ожидаемый
Поведение
mydt <- data.table(x = 1:3, y = 5:7)
myfunction <- function(dt) {
dt[, z := y - x][]
df <- 1
}
myfunction(mydt) # Nothing printed as expected
mydt # Content printed as desired
## x y z
## 1: 1 5 4
## 2: 2 6 4
## 3: 3 7 4