Сохранение настроек пакета между сеансами

Существует ли окончательный способ сохранения параметров или информации, относящихся к определенному пакету между сеансами?

Например, скажем, кто-то сделал игру и выпустил ее как R-пакет. Если бы они хотели сохранить высокие баллы и не иметь их reset, каждый раз, когда R запустил новый сеанс, что было бы лучшим способом сделать это? В настоящее время я могу думать только о хранении файла в домашнем каталоге пользователей, но я не уверен, нравится ли мне этот подход.

Ответ 1

Это может быть подход. Я создал фиктивный пакет с фиктивной функцией (любая функция, которую я создаю, является фиктивной функцией) и набор данных, который я назвал scores, который я задал следующим образом:

scores <- NA

Затем я создал пакет с набором данных баллов.

Затем я использовал следующее, чтобы изменить набор данных из R.

loc <- paste0(find.package("new"), "/Data")
unlink(paste0(loc, "/scores.rda"), recursive = TRUE, force = FALSE)
scores <- 10

save(scores, file=paste0(loc, "/scores.rda"))

Затем, когда я выгружаю библиотеку и повторно загружается, набор данных теперь говорит:

> scores
[1] 10

Может ли это быть изменено, чтобы делать то, что вы хотите? Вам нужно будет сэкономить между ними, но я не уверен, как это сделать, не входя в функцию .Last.

EDIT:

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

RData.rbd, RData.rbx, а не как .rda файлы. Это означает, что подход, который я использую выше, не имеет ничего общего с тем, что мы хотим, чтобы он автоматически распознавался.

EDIT2 Этот подход работает, и я попробовал его на пакете, который я сделал. Вы не можете выполнять ленивую загрузку данных, и вам нужно либо явно использовать data(scores), либо использовать data(scores) внутри функции, которую вы вызываете. Я также назначил scores to .scores int he global.env при первом создании и использовал exists внутри функции, чтобы увидеть, существует ли она. Если `.scores. Я назначил это для оценки внутри функции. После того, как вы выгрузите библиотеку и снова лайдо, вам больше не придется беспокоиться об этом.

Возможно, альтернативой является сохранение этой функции как-то, которая может быть изменена с помощью совета Джоша здесь: Постоянная замена функции

Ответ 2

Я думаю, что нет способа сохранить настройки, не сохраняя их на диске или базе данных, так или иначе. Это можно сделать тихо, если поместить код ниже в ~/.Rprofile. Однако, если у вас есть пакеты, которые сохраняют настройки другими способами, чем с помощью options, вам нужно добавить их вручную.

Я знаю, что это именно то, что вы сказали, чего не хотите, но это может вызвать некоторые дебаты по крайней мере.

.Last <- function(){
    my.options <- options()
    save(my.options, file="~/.Roptions.Rdata")
}

.First <- function(){
    tryCatch({
        load("~/.Roptions.Rdata")
        do.call(options, my.options)
        rm(my.options)
    }, error=function(...){})
}

В моем suprise try(..., silent=TRUE) появляется предупреждение при запуске, если ~/.Roptions.Rdata не существует, поэтому я использовал tryCatch.