Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Save package settings between sessions

Tags:

package

r

Is there a definitive way to save options or information pertaining to a certain package between sessions?

For example say somebody made a game and released it as an R package. If they wanted to save high scores and not have them reset each time R started a new session what would be the best way to do this? Currently I can only think of storing a file in the users home directory but I'm not sure if I like that approach.

like image 724
Dason Avatar asked Aug 06 '12 19:08

Dason


3 Answers

This may be an approach. I created a dummy package with a dummy function (any function I create is bound to be a dummy function) and a data set I called scores that I set as follows:

scores <- NA

Then I created the package with the scores data set.

Then I used the following to change the data set from within 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"))

Then when I unloaded the library and re loaded agin the data set now says:

> scores
[1] 10

Could this be modified to do what you want? You'd have to have it save in between somehow but am not sure on how to do this without messing with .Last function.

EDIT:

It appears this option is not viable in that when you compile as a package and use lazy load it saves the data sets as:

RData.rbd, RData.rbx, not as .rda files. That means the approach I use above is kinda worthless in that we want it to automatically be recognized.

EDIT2 This approach works and I tried it on a package I made. You can't do lazy load of the data and you have to either explicitly use data(scores) or use data(scores) inside of the function you're calling. I also assigned scores to .scores int he global.env the first time it was created and used exists inside the function to see if it exists. If `.scores. existed I assigned that to scores within the function. Once you unload the library and laod again you never have to worry about that again.

Maybe an alternative is to save this as a function somehow that can be altered using Josh's advice here: Permanently replacing a function

like image 51
Tyler Rinker Avatar answered Oct 22 '22 05:10

Tyler Rinker


I guess there is no way to store settings without saving them to disk or a database, some way or another. It can be done silently though by putting the code below in your ~/.Rprofile. However, if you have packages that save settings in other ways than using options you need to add them manually.

I know this is exactly what you said you did not want, but it might spark some debate at least.

.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(...){})
}

To my suprise try(..., silent=TRUE) gives a warning on startup if ~/.Roptions.Rdata does not exist, which is why I used tryCatch instead.

like image 39
Backlin Avatar answered Oct 22 '22 06:10

Backlin


The modern answer to this problem is well explained at https://blog.r-hub.io/2020/03/12/user-preferences/

I think I will be trying the hoardr package! Here is an example that worked for me :)

x <- hoardr::hoard()
x$cache_path_set("yourpackage", type = 'user_cache_dir')
x$mkdir()

scores<-data.frame(
  user=c("one","two","three"),
  score=c("500,200,1100")
  )
save(scores,file = file.path(x$cache_path_get(), "scores.rdata"))

x$list()
x$details()

#new session
x <- hoardr::hoard()
x$cache_path_set("yourpackage", type = 'user_cache_dir')
x$list()
x$details()
load(file = file.path(x$cache_path_get(), "scores.rdata"))

PS - you can see a working example in the rnoaa package found on at github "opensci/rnoaa". Check their R/onload.r file! I can expand if needed.

like image 34
Brandon Rose Avatar answered Oct 22 '22 06:10

Brandon Rose