Почему data.table не знает "J"? - PullRequest
4 голосов
/ 18 октября 2019

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

routes[J(x1, y1, x2, y2), nomatch = 0L]

Ошибка в J (x1, y1, x2, y2): не удалось найти функцию "J"

Как сказано: этот пакет работает и library(data.table) установлен .

Теперь я подумал, что я делаю небольшую проверку, как предложено здесь - окружениебез изменений :

dt = data.table( id = 1L, start = c( 9, 21, 5 ), end = c( 10, 22, 7 ) )
data.table::setkey(dt, "start")
dt[J(1), nomatch = 0L]

Пустой data.table (0 строк) из 3 столбцов: id, start, end

, и я получаю правильный результат? У меня ни у кого есть идея, как создать воспроизводимый пример, я постараюсь. Это не имеет никакого смысла для меня ... Поэтому я попробовал еще раз, но

routes[J(x1, y1, x2, y2), nomatch = 0L]

Ошибка в J (x1, y1, x2, y2): не смог найти функцию "J"

Любой намек высоко ценится

Снимок экрана :

enter image description here

Воспроизводимый пример с более чем одним параметром в data.table:

library(data.table)
r <- data.table::data.table(lat1 = numeric(0), lng1 = numeric(0),
                            lat2 = numeric(0), lng2 = numeric(0), 
                            time = numeric(0))
data.table::setkey(r, lat1, lng1, lat2, lng2)

lat1 = 1
lat2 = 2
lng1 = 11
lng2 = 22
li <- data.table::data.table(lat1=lat1, lng1=lng1, lat2=lat2, lng2=lng2, time=time)
r <- rbindlist(list(r, li))
data.table::setkey(r, lat1, lng1, lat2, lng2)

r[J(1, 11, 2, 22), nomatch = 0L]
# lat1 lng1 lat2 lng2       time
# 1:    1   11    2   22 <function>
r[J(1, 11, 2, 0), nomatch = 0L]
# Empty data.table (0 rows) of 5 cols: lat1,lng1,lat2,lng2,time

But still:
routes[J(1, 11, 2, 22), nomatch = 0L]
# Error in J(1, 11, 2, 22) : could not find function "J"

1 Ответ

8 голосов
/ 18 октября 2019

J не является функцией. Это псевдоним, который заменяется перед оценкой:

https://github.com/Rdatatable/data.table/blob/master/R/data.table.R#L102

Я подозреваю, routes не является data.table.

Добавление моих комментариев здесьпотому что они иллюстрируют мой мыслительный процесс, который позволяет решить:

Я ответил на очень похожий вопрос, где кто-то искал функцию .. Итак, я был почти уверен в этом, и мне нужно было только поискать в исходном коде J. Как только я подтвердил, что это псевдоним, такой как ., было легко сделать вывод, что [.data.table не мог быть вызван вашим кодом.

Вы позвонили [, который имеет (более) 2 параметров. Так что никаких ошибок нет. Только после оценки первого параметра вы можете получить ошибку.

...