Вопрос по r – Использование пакета data.table внутри моего собственного пакета

62

Я пытаюсь использовать пакет data.table внутри моего собственного пакета. MWE выглядит следующим образом:

Я создаю функцию test.fun, которая просто создает небольшой объект data.table, а затем суммирует & quot; Val & quot; группировка столбцов по "A" колонка. Код

test.fun<-function ()
{
    library(data.table)
    testdata<-data.table(A=rep(seq(1,5), 5), Val=rnorm(25))
    setkey(testdata, A)
    res<-testdata[,{list(Ct=length(Val),Total=sum(Val),Avg=mean(Val))},"A"]
    return(res)
}

Когда я создаю эту функцию в обычном сеансе R, а затем запускаю функцию, она работает как положено.

> res<-test.fun()
data.table 1.8.0  For help type: help("data.table")
> res
     A Ct      Total        Avg
[1,] 1  5 -0.5326444 -0.1065289
[2,] 2  5 -4.0832062 -0.8166412
[3,] 3  5  0.9458251  0.1891650
[4,] 4  5  2.0474791  0.4094958
[5,] 5  5  2.3609443  0.4721889

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

> library(testpackage)
> res<-test.fun()
data.table 1.8.0  For help type: help("data.table")
Error in `[.data.frame`(x, i, j) : object 'Val' not found

Кто-нибудь может объяснить мне, почему это происходит, и что я могу сделать, чтобы это исправить. Любая помощь очень ценится.

Я предполагаю, что вы не объявили зависимость. Вы должны удалитьlibrary(data.table) от вашей функции, и объявитьdepends:data.table в вашем пространстве имен и ОПИСАНИЕ. Andrie

Ваш Ответ

2   ответа
17

1) Добавитьdata.table вImports в вашемDESCRIPTION файл.

2) Добавить@import data.table к вашему соответствующему файлу .R (то есть файлу .R, в котором находится ваша функция, которая выдает ошибкуError in [.data.frame(x, i, j) : object 'Val' not found).

3) Типlibrary(devtools) и установите ваш рабочий каталог так, чтобы он указывал на главный каталог вашего пакета R.

4) Типdocument(), Это гарантирует, что вашNAMESPACE файл включает в себяimport(data.table) линия.

5) Типbuild()

6) Типinstall()

Для хорошего учебника о том, чтоbuild() а такжеinstall() делай, смотри:http://kbroman.org/pkg_primer/.

Затем, как только вы закроете сеанс R и войдете в следующий раз, вы можете сразу же перейти к:

1) Типlibrary("my_R_package")

2) Введите имя вашей функции, которое размещено в упомянутом выше файле .R.

3) Наслаждайтесь! Вы больше не должны получать страшныеError in [.data.frame(x, i, j) : object 'Val' not found

@import data.tableError: User Rate Limit Exceeded
76

vignette("datatable-faq")), а также новыйвиньетка на импортdata.table:

FAQ 6.9: I have created a package that depends on data.table. How do I ensure my package is data.table-aware so that inheritance from data.frame works?

Either i) include data.table in the Depends: field of your DESCRIPTION file, or ii) include data.table in the Imports: field of your DESCRIPTION file AND import(data.table) in your NAMESPACE file.

Дальнейшая предыстория ... вверху[.data.table (и другиеdata.table функции), вы увидите переключатель в зависимости от результата вызоваcedta(), Это означает вызов таблицы данных среды. Typingdata.table:::cedta показывает, как это делается. Он опирается на вызывающий пакет, имеющий пространство имен, и это пространство имен импортируется или зависит отdata.table, Вот какdata.table могут быть переданы вdata.table-aware пакеты (такие как функции вbase) и эти пакеты могут использовать абсолютно стандартные[.data.frame синтаксис наdata.tableблаженно не подозревая, чтоdata.frame is() data.table, тоже.

Это также почемуdata.table Наследование ранее не было совместимо с пакетами без пространства имен, и поэтому по запросу пользователя мы должны были попросить авторов таких пакетов добавить пространство имен в их пакет для совместимости. К счастью, теперь, когда R добавляет пространство имен по умолчанию для пакетов, в которых отсутствует один (из v2.14.0), эта проблема исчезла:

CHANGES IN R VERSION 2.14.0
* All packages must have a namespace, and one is created on installation if not supplied in the sources.

Error: User Rate Limit Exceededboth Импорт в ОПИСАНИЕand import(data.table)Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededdata.tableError: User Rate Limit Exceededdata.tableError: User Rate Limit Exceededdata.frameError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded@import data.tableError: User Rate Limit Exceededimport(data.table)Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы