Добавление и доступ к файлам пакета в новый пакет R

Я создал новый проект как «пакет R» в RStudio v. 1.0.1.153. По умолчанию такой новый проект пакета R поставляется с файлом hello.R, содержащим функцию шаблона.

hello <- function() {
  print("Hello, world!")
}

к которому можно получить доступ, просто создав и перезагрузив пакет (Ctrl+Shift+B), а затем в другом сеансе R просто загрузив собранный пакет и запустив функцию:

> library(mylibrary)
> hello()
[1] "Hello, world!"

Теперь я хотел бы организовать свои функции в несколько файлов в пакете. Я добавляю новый файл methods.R в подкаталог .\R\ пакета с другой функцией:

helloYouToo <- function() {
  print("Hello you too!")
}

Однако, когда я пересобираю пакет и перезагружаю библиотеку, я не могу получить доступ к этой функции:

> library(mylibrary)
> helloYouToo()
Error in helloYouToo() : could not find function "helloYouToo"

У меня есть несколько вопросов. Как я должен

  1. разделить функции пакета на несколько файлов (а не только один файл hello.R), чтобы файлы и определенные там функции были включены в пакет, и
  2. каков предпочтительный способ доступа также внутри пакета к таким функциям, которые определены в том же пакете, но в другом файле (например, в methods.R)?

person Heikki    schedule 27.10.2017    source источник
comment
Я пытался прочитать несколько руководств для начинающих по добавлению файлов, но они, похоже, сосредоточены на советах записывать все функции пакета в один файл.   -  person Heikki    schedule 28.10.2017
comment
Вы экспортировали функцию на странице NAMESPACE? Используете ли вы roxygen для создания документации? Вы выбрали только пакет R или пакет R с помощью devtools? Если вы еще этого не сделали, вам, вероятно, следует прочитать руководство Hadley по пакетам R.   -  person MrFlick    schedule 28.10.2017
comment
Я использую R 3.4.2, и установка devtools стала возможной совсем недавно. Поэтому я установил devtools и попытался запустить devtools::load_all(), который установил roxygen. Затем запуск devtools::load_all() сделал helloYouToo() доступным в сеансе R, где я создаю пакет. Однако эта функция не стала доступной в другом сеансе R. Удивительно, но перезапуск другого сеанса R помог, и после этого library(mylibrary) сделал helloYouToo() доступным.   -  person Heikki    schedule 28.10.2017
comment
Действительно ли необходимо перезапустить сеанс R, чтобы обновить определения функций пакета?   -  person Heikki    schedule 28.10.2017


Ответы (1)


Как предложил @MrFlick, мне удалось разделить функции на несколько файлов, установив devtools и roxygen (с зависимостями).

После этого перестроение пакета сделало новые функции в других файлах доступными для пользователей, загружающих пакет. Однако необходимо было перезапустить сеанс R, чтобы сделать доступными обновленные определения функций:

Restarting R session...

> library(mylibrary)
> helloYouToo()
[1] "Hello you too!"

Можно было даже определить в пакете функцию, которая использует функции, определенные в двух отдельных файлах:

helloDouble <- function() {
  hello()
  helloYouToo()
}

В результате в

Restarting R session...

> library(mylibrary)
> helloDouble()
[1] "Hello, world!"
[1] "Hello you too!"

Мне не нужно было трогать файл NAMESPACE, потому что он такой же общий, как

exportPattern("^[[:alpha:]]+")

позволяя всем новым функциям, которые я создал в пакете, быть доступными для пользователя пакета.

person Heikki    schedule 27.10.2017