Создание пакета в R, который зависит от data.table
Я должен сделать пакет R, который зависит от пакета data.table. Однако, если бы я сделал такую функцию, как следующая в пакете
randomdt <- function(){
dt <- data.table(random = rnorm(10))
dt[dt$random > 0]
}
функция [ будет использовать метод для data.frame, а не для data.table и, следовательно, ошибки
Error in `[.data.frame`(x, i) : undefined columns selected
будет появляться. Обычно это можно решить с помощью get('[.data.table')
или аналогичный метод (package::function
самое простое) но это, кажется, не работает. В конце концов, [
это примитивная функция, и я не знаю, как методы к ней работают.
Итак, как я могу вызвать data.table [
функция из моего пакета?
1 ответ
Обновлено на основе некоторых отзывов от MichaelChirico и комментариев Arun и Soheil.
Грубо говоря, есть два подхода, которые вы могли бы рассмотреть. Первый - это построение зависимости в самом пакете, а второй - включение строк в ваш R-код, которые проверяют наличие data.table
(и, возможно, даже установить его автоматически, если он не найден).
data.table
FAQ, в частности, решает эту проблему в 6.9, и утверждает, что вы можете гарантировать data.table
соответственно загружен вашей посылкой:
Либо i) включите data.table в поле Depends: вашего файла DESCRIPTION, либо ii) включите data.table в поле Imports: вашего файла DESCRIPTION И импортируйте (data.table) в ваш файл NAMESPACE.
Как отмечено в комментариях, это обычное поведение R, которое присутствует в многочисленных пакетах.
Альтернативный подход заключается в создании определенных строк кода, которые проверяют и импортируют необходимые пакеты как часть вашего кода. Я бы сказал, что это не идеальное решение, учитывая элегантность использования опции, представленной выше. Однако это технически возможно.
Простой способ сделать это будет использовать либо require
или же library
проверить на наличие data.table
, с ошибкой, если она не может быть прикреплена. Вы даже можете использовать простой набор условных операторов для запуска install.packages
установить то, что вам нужно, если их загрузка не удалась.
У Yihui Xie (известности knitr) есть отличный пост о разнице между library
а также require
здесь и дает веские основания для использования library
в случаях, когда пакет абсолютно необходим для следующего кода.