Я пишу пакет R, в котором я использую некоторые функции data.table (в частности, ключ и подмножество на основе ключей).Я где-то читал, что для того, чтобы написать «хороший» пакет, мне нужно было убедиться, что data.table нужно только загружать, а не присоединять.Поэтому при написании кода я убедился, что я не прикрепляю data.table, а скорее направил вызовы функций в пространство имен data.table с помощью команды data.table::
.Примером может быть:
ExampleFunction<-function(){
set.seed(2)
DT<-data.table::data.table(a=sample(letters[1:5],20,T),b=sample(1:2,20,T),c=1:20)
data.table::setkeyv(DT,c("a","b"))
return(DT[list("a",2),])
}
Обратите внимание, что в строке возврата используется команда, которая работает только с data.tables, но я не могу указать пространство имен data.table стандартным способом (так как при поискеDT в пространстве имен data.table).В любом случае, запуск этой функции из консоли (без подключения к data.table) дает ожидаемый результат:
> ExampleFunction()
a b c
1: a 2 1
2: a 2 14
Однако, когда я собираю свой пакет (с таблицей data.table, указанной в описании в качестве импорта,не является зависимостью), и, выполнив ту же функцию, я получаю следующую ошибку:
> ExampleFunction()
Error in xj[i] : invalid subscript type 'list'
При следующей трассировке:
4. `[.data.frame`(x, i, j)
3. `[.data.table`(DT, list("a", 2), ) at Examples.R#5
2. DT[list("a", 2), ] at Examples.R#5
1. ExampleFunction()
Трассировка показывает, что эта ошибка возникает в обратной строкефункции, что означает, что он больше не распознает это как команду data.table.Мой вопрос: почему это идет не так в пакете, если он работает вне пакета?Должен ли мой пакет зависеть от data.table, а не просто импортировать его?И, наконец, есть ли способ указать, что DT[list("a",2),]
является командой data.table?