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

объекты 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 

Не могли бы вы объяснить, почему это происходит и как его предотвратить?

4b9b3361

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