2012-08-06 2 views
10

Existe-t-il un moyen définitif d'enregistrer les options ou les informations relatives à un package donné entre les sessions? Par exemple, disons que quelqu'un a créé un jeu et l'a libéré sous la forme d'un paquet R. S'ils voulaient sauvegarder des scores élevés et ne pas les réinitialiser à chaque fois que R commençait une nouvelle session, quelle serait la meilleure façon de procéder? Actuellement, je ne peux penser à stocker un fichier dans le répertoire de base des utilisateurs, mais je ne suis pas sûr si j'aime cette approche.Enregistrer les paramètres du package entre les sessions

+0

Pas un paquet R en tant que tel, mais il est assez typique dans le monde nix pour stocker ce genre de chose dans un fichier caché ou un répertoire caché dans le répertoire de base des utilisateurs. Sur Windows, vous pouvez utiliser un répertoire de données applicate ou le registre. – frankc

+0

J'ai eu la même question moi-même, je pense que la clé peut être dans ce poste ici: http://stackoverflow.com/questions/8661526/permanently-replacing-a-function –

+0

"quelqu'un a fait un jeu et l'a publié comme un paquet R "<- Errror, ne pas analyser –

Répondre

4

Cela peut être une approche. J'ai créé un paquet factice avec une fonction factice (une fonction que je crée est lié à une fonction factice) et un ensemble de données que j'ai appelé scores que je mets comme suit:

scores <- NA 

Ensuite, j'ai créé le paquet avec les scores ensemble de données.

J'ai ensuite utilisé ce qui suit pour modifier l'ensemble de données à l'intérieur 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")) 

Puis, quand j'ai déchargé la bibliothèque et re chargé Agin l'ensemble de données dit maintenant:

> scores 
[1] 10 

Cela pourrait-il être modifié pour faire ce que vous voulez? Vous devriez l'avoir enregistrer entre d'une certaine manière, mais je ne suis pas sûr de la façon de le faire sans jouer avec la fonction .Last.

EDIT:

Il semble que cette option n'est pas viable que lorsque vous compilez un paquet et d'utiliser la charge paresseux, il enregistre les ensembles de données:

RData.rbd, RData.rbx, pas en tant que fichiers .rda. Cela signifie que l'approche que j'utilise ci-dessus est un peu sans valeur dans la mesure où nous voulons qu'elle soit automatiquement reconnue.

EDIT2 Cette approche fonctionne et je l'ai essayé sur un paquet que j'ai fait. Vous ne pouvez pas faire la charge paresseuse des données et vous devez utiliser explicitement data(scores) ou utiliser data(scores) dans la fonction que vous appelez. J'ai également affecté scores à .scores int global.env la première fois qu'il a été créé et utilisé exists à l'intérieur de la fonction pour voir si elle existe. Si `.scores. existé j'ai attribué cela aux scores au sein de la fonction. Une fois que vous déchargez la bibliothèque et que vous recommencez, vous n'avez plus jamais à vous en soucier.

Peut-être une alternative est de sauver ce en fonction d'une certaine manière qui peut être modifié en utilisant les conseils de Josh ici: Permanently replacing a function

+0

Quelle est votre opinion sur '.onUnload'? Je ne l'ai pas essayé mais il devrait être exécuté pour tous les paquets quand R est fermé, non? – Backlin

+3

Vous pouvez ré-enregistrer des "scores" à chaque fois qu'il est modifié (en supposant que ce n'est pas très souvent). Ensuite, vous n'avez pas à vous soucier de le sauver "à la fin" –

+0

Je vais devoir jouer avec mais il semble que cela fera ce que je veux. – Dason

1

Je suppose qu'il n'y a aucun moyen de stocker les paramètres sans les enregistrer sur le disque ou une base de données, d'une manière ou d'une autre. Cela peut être fait silencieusement en plaçant le code ci-dessous dans votre ~/.Rprofile. Toutefois, si vous avez des packages qui enregistrent les paramètres autrement qu'en utilisant options, vous devez les ajouter manuellement. Je sais que c'est exactement ce que vous avez dit que vous ne vouliez pas, mais cela pourrait susciter quelques débats au moins.

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

A ma surprise try(..., silent=TRUE) donne un avertissement au démarrage si ~/.Roptions.Rdata n'existe pas, ce qui est la raison pour laquelle je tryCatch à la place.

+0

Des idées sur la façon de faire cela sans demander à l'utilisateur de modifier leur .Rprofile? – Dason

+1

Vous pouvez créer un paquet pour cela et placer le code ci-dessus dans '.onLoad()' et '.onUnload()' dans 'zzz.R', mais vous devrez quand même charger ce paquet à chaque fois que vous démarrez R. – Backlin

Questions connexes