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