Сборка пакета R для Linux — особое внимание для data.table в DESCRIPTION и NAMESPACE

Если я использую исходный код, то все работает, но когда я создаю пакет/функцию, это дает мне ошибку. Я что-то упустил?

тестовый пакет

тест ‹- функция () {

library("data.table")
dd <- mtcars
setDT(dd)
dd$cnt <- 1
eval(parse(text=paste0("dd <- unique(dd[,list(cnt, mpg, cyl)])")))
eval(parse(text=paste0("dd1 <- dd[order(mpg, cyl)]")))
print(dd1)

}

создайте пакет, используя сборку R CMD для Linux

test 
   |__R
      |__test.r
   |__DESCRIPTION
   |__NAMESPACE

Тест сборки R CMD

R CMD УСТАНОВИТЬ test_1.0.tar.gz

Содержание ОПИСАНИЯ

Package: test
Title: test
Version: 1.0
Authors@R: person("xyz", "xyz", email = "[email protected]",
                  role = c("aut", "cre"))
Description: test
Depends: R (>= 3.6.0)
License: test
Encoding: UTF-8
LazyData: true
Imports:
    data.table

использовать функцию в R

библиотека ("тест")

тестовое задание()

Получите сообщение об ошибке, как показано ниже

Ошибка в [.data.frame(x, i, j): объект 'cnt' не подходит

Код R без пакета и он работает

library("data.table")
dd <- mtcars
setDT(dd)
dd$cnt <- 1
eval(parse(text=paste0("dd <- unique(dd[,list(cnt, mpg, cyl)])")))
eval(parse(text=paste0("dd1 <- dd[order(mpg, cyl)]")))
print(dd1)

person R007    schedule 23.02.2020    source источник
comment
Загляните в функцию package.skeleton() и посмотрите, что она создает — для создания пакета требуется нечто большее. Полная информация содержится в руководстве Writing R Extensions. (И мой пакет pkgKitten помогает с некоторой постобработкой package.skeleton(), которая оставляет некоторые вещи, которые вы должны отредактировать, что сбивает с толку, когда вы начинаете. В RStudio также есть помощник генератора пакетов, как и в других пакетах.)   -  person Dirk Eddelbuettel    schedule 23.02.2020
comment
Спасибо, я добавил больше деталей в структуру каталогов пакетов. Я посмотрю на package.skeleton(). Просто пытаюсь понять, как проще всего создать тестовый пакет, не используя множество других зависимых пакетов и т. д.   -  person R007    schedule 23.02.2020
comment
Хороший подход! В этом случае база R и ее функция package.skeleton() должны стать вашими новыми лучшими друзьями. Меня просто немного смущает, что он никогда не пройдет R CMD check --as-cran сразу после создания, следовательно, pkgKitten. Но я использую тот же подход, что и вы: попробуйте сначала с минимальным количеством помощников, чтобы действительно понять минимальную структуру.   -  person Dirk Eddelbuettel    schedule 23.02.2020
comment
На самом деле, несколько лет назад я провел мастер-класс, где мы создавали каждый файл вручную, и вы могли посмотреть слайды/проверить, держится ли он еще: dirk.eddelbuettel.com/papers/r_package_development_nov2014.pdf   -  person Dirk Eddelbuettel    schedule 23.02.2020
comment
Что-то не так с вашим кодом. Используйте dd[, cnt:=1] для создания столбца data.table. И вам не нужно eval(parse(txt)), но это действительно другой вопрос ...   -  person Dirk Eddelbuettel    schedule 23.02.2020
comment
Я попытался использовать RStudio для создания пакета. Я чувствую, что есть некоторый конфликт с data.table. т.е. если я правильно понял, то data.table перехватывает данные. функции фрейма, если объект имеет тип data.table. Возможно, во время бинарной компиляции что-то происходит.   -  person R007    schedule 23.02.2020
comment
использование dd[, cnt:=1] также приводит к той же ошибке.   -  person R007    schedule 23.02.2020
comment
Бинарной компиляции нет, но я также обнаружил, что data.table иногда требует особого внимания. Вы import() сделали это в NAMESPACE? (И, конечно, у вас не должно быть вызовов library() в коде R в пакете. Посмотрите, что еще говорят R CMD check и/или кнопка check в RStudio).   -  person Dirk Eddelbuettel    schedule 23.02.2020


Ответы (1)


Спасибо @Dirk Eddelbuettel. Вы правы, и это сработало. Я узнал, что на этот вопрос ответили в StackOverflow, а также доступна хорошая документация.

https://cran.r-project.org/web/packages/data.table/vignettes/datatable-importing.html

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

person R007    schedule 23.02.2020