Создание пакета в 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 в случаях, когда пакет абсолютно необходим для следующего кода.

Другие вопросы по тегам