загадочное сообщение перемещается из таблицы в таблицу данных - PullRequest
1 голос
/ 07 марта 2019

Рассмотрим этот простой пример

mytib <- tibble(a = c(1,2,3),
                text = c('a','b','c'))
# A tibble: 3 x 2
      a text 
  <dbl> <chr>
1     1 a    
2     2 b    
3     3 c 

Теперь мне нужно использовать некоторые магические функции data.table, поэтому я конвертирую в data.table, используя setDT(), который, кажется, работает правильно:

mytib %>% setDT()
> mytib
   a text
1: 1    a
2: 2    b
3: 3    c

Но теперь создание нового столбца по ссылке вызывает это сумасшедшее сообщение об ошибке.

> mytib[, newcol := text]

Предупреждающее сообщение: In [.data.table (mytib,, := (newcol, text)):
Неправильный .internal.selfref обнаружен и исправлен путем создания (мелкой) копии data.table, чтобы: = можно было добавить этот новый столбец по ссылке.Ранее этот data.table был скопирован с помощью R (или был создан вручную с использованием структуры () или аналогичной).Избегайте ключей <-, names <- и attr <- которые в R в настоящее время (и странно) могут копировать весь data.table.Вместо этого используйте синтаксис set *, чтобы избежать копирования:? Set,? Setnames и? Setattr.Если это сообщение не помогло, сообщите о своем случае использования средству отслеживания проблем data.table, чтобы устранить основную причину или улучшить это сообщение. </p>

Должен ли я быть обеспокоен?Спасибо!

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Почему бы вам просто не вызвать функцию 'setDT' напрямую, вместо использования оператора "%>%"?Это может быть как-то связано с тем, что «data.table» использует «ссылки» для доступа к данным, и это может быть причиной проблемы.Я попробовал это только с вызовом, и он работал нормально:

> library(data.table)

> library(tidyverse)

> mytib <- tibble(a = c(1,2,3),
+                 text = c('a','b','c'))
> setDT(mytib)
> mytib[, newcol := 'text']
>
1 голос
/ 07 марта 2019

Это немного странно - возможно, что-то связано с преобразованием, и, возможно, ошибка.

После небольшого тестирования кажется, что это происходит только в первый раз, когда вы хотите изменить data.table после преобразования.

mytib <- tibble(a = c(1,2,3),
            text = c('a','b','c'))

mytib %>% setDT()
mytib[,newcol := text] # add initially - causes a warning, but still completes
mytib[,newcol := NULL] # removes fine
mytib[,newcol := text] # works fine - no error

Поскольку результат возвращается в порядке и впоследствии не выдает никаких предупреждений, он, вероятно, игнорируется.

Обратите внимание, что эта ошибка происходит, по-видимому, независимо от того, из чего вы выполняете преобразование - списка, кадра данных или таблицы, а также независимо от того, копируете ли вы уже существующий столбец или создаете совершенно новый столбец.

...