Существует ли постоянное место, которое всегда доступно для записи, которое может использоваться в качестве кэша данных в пакете?

Есть ли предопределенное место, где R-пакет может хранить кэшированные данные? Данные должны сохраняться в течение сеансов. Я думал о создании подкаталога ${R_LIBS_USER}/package_name, но я не уверен, что он переносимый, и если это "разрешено", если мой пакет установлен в системе.

Идея следующая: Создайте R script mydata.R в подкаталоге data пакета, который будет выполнен, вызвав data(mydata) (согласно документации data()). Этот script будет загружать данные из Интернета и кэшировать его, если он ранее не кэшировался. (Если данные уже кэшированы, кэш будет использоваться.) Кроме того, будет предоставлена ​​функция для недействительности кеша и/или проверки доступности новой версии данных в Интернете.

Это из документации data():

В настоящее время поддерживаются четыре формата файлов данных:

  • файлы, заканчивающиеся на .R или '.r, являются source() d in, а рабочий каталог R временно изменен в каталог, содержащий соответствующий файл. (данные гарантируют, что пакет utils подключен, если он был запущен через utils:: data.)

  • ...

В самом деле, создав файл fortytwo.R в подкаталоге data пакета со следующим содержимым:

fortytwo = data.frame(answer=42)

а затем выполнение data(fortytwo) создает переменную фрейма данных fortytwo. Теперь возникает вопрос: где бы fortytwo.R кэшировать данные, если их было сложно вычислить?

EDIT. Я думаю о создании двух пакетов: "пакет данных", который предоставляет данные, и пакет "code", который работает на нем. Вопрос касается пакета данных: где он может хранить файлы в хранилище для каждого пользователя, чтобы он был постоянным в R-сессиях и доступен из разных R-проектов?

Связанный: Пакет, который загружает данные из Интернета во время установки.

Ответ 1

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

Когда пользователи загружают R.cache(library(R.cache)), они получают следующее приглашение:

The R.cache package needs to create a directory that will hold cache files.
It is convenient to use one in the user home directory, because it remains
also after restarting R. Do you wish to create the '~/.Rcache/' directory? If
not, a temporary directory (/tmp/RtmpqdUcbP/.Rcache) that is specific to this
R session will be used. [Y/n]:

Затем они могут выбрать создание каталога кэша в своем домашнем каталоге, который предположительно является постоянным, или для создания каталога, зависящего от сеанса. Если ваш пакет данных зависит от R.cache, вы можете проверить наличие кешированных объектов в своей функции .onLoad() hook и загрузить данные, если их там нет. В качестве альтернативы вы можете сделать это так, как это предлагается в вашем собственном вопросе.

Ответ 2

Вы просматривали базы данных в памяти? H2 и Redis имеют привязки в R через RH2 и rredis - оба позволяют вам делиться данными через r сессий - пока сеанс создания не будет жив. для того, чтобы он сохранялся в неконкурентных сеансах, вам нужно записать свои данные на диск (при условии, что вы не можете воссоздать его "на лету", что приведет к поражению цели этого вопроса), и я считаю, что данные пакет будет хорошим вариантом. Таким образом, вы можете добавить функцию обновления, которая инициализирует каждый раз при загрузке любого пакета (т.е. Если пакет кода имеет правильные зависимости)

В качестве примера можно привести пакеты RWeka и RWekaJars. Посмотрите их на CRAN, и должно быть довольно легко понять, как они работают.