2012-08-06 12 views
10

Esiste un modo definitivo per salvare le opzioni o le informazioni relative a un determinato pacchetto tra le sessioni?Salva le impostazioni del pacchetto tra le sessioni

Ad esempio, dire che qualcuno ha creato un gioco e lo ha rilasciato come pacchetto R. Se volevano salvare punteggi alti e non averli reimpostati ogni volta che R ha iniziato una nuova sessione quale sarebbe il modo migliore per farlo? Attualmente posso solo pensare di memorizzare un file nella home directory degli utenti, ma non sono sicuro che mi piaccia questo approccio.

+0

Non per un pacchetto di R per sé, ma è abbastanza tipico nel mondo nix per memorizzare questo tipo di cosa in un file nascosto o una directory nascosta nella home directory degli utenti. Su Windows è possibile utilizzare una directory di dati applicata o il registro. – frankc

+0

Ho avuto la stessa domanda io stesso, penso che la chiave potrebbe essere in questo post SO qui: http://stackoverflow.com/questions/8661526/permanently-replacing-a-function –

+0

"qualcuno ha fatto un gioco e lo ha rilasciato come pacchetto R "<- Errror, non analizza –

risposta

4

Questo potrebbe essere un approccio. Ho creato un pacchetto fittizio con una funzione fittizia (una funzione che creo è destinato ad essere una funzione fittizio) e un set di dati ho chiamato scores che ho impostato come segue:

scores <- NA 

Poi ho creato il pacchetto con i punteggi set di dati.

poi ho usato il seguente per cambiare il set di dati dall'interno 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")) 

Poi, quando ho scaricato la biblioteca e ri caricati verremo i set di dati ora dice:

> scores 
[1] 10 

Potrebbe questo essere modificato per fare ciò che vuoi? Dovresti farlo salvare in qualche modo, ma non sono sicuro su come farlo senza fare casino con la funzione .Last.

EDIT:

Esso appare questa opzione non è praticabile in quanto quando si compila come un pacchetto e utilizzare carico pigri salva i set di dati come:

RData.rbd, RData.rbx, non come file .rda. Ciò significa che l'approccio che uso sopra è piuttosto inutile in quanto vogliamo che venga riconosciuto automaticamente.

EDIT2 Questo approccio funziona e l'ho provato su un pacchetto che ho creato. Non è possibile eseguire il carico pigro dei dati e utilizzare esplicitamente data(scores) o utilizzare data(scores) all'interno della funzione che si sta chiamando. Ho anche assegnato scores a .scores int global.env la prima volta che è stato creato e utilizzato exists all'interno della funzione per vedere se esiste. Se `.scores. esisteva che l'ho assegnato ai punteggi all'interno della funzione. Una volta scaricata la libreria e recuperata, non dovrai più preoccupartene.

Forse un'alternativa è quella di salvare questo come una funzione in qualche modo che può essere modificata usando il consiglio di Josh qui: Permanently replacing a function

+0

Cosa ne pensi di '. OnUnload'? Non l'ho provato ma dovrebbe essere eseguito per tutti i pacchetti quando R è chiuso, giusto? – Backlin

+3

È possibile salvare nuovamente il punteggio in qualsiasi momento in cui viene modificato (supponendo che non sia molto frequente). Quindi non devi preoccuparti di salvarlo "alla fine" –

+0

Dovrò giocarci, ma sembra che farà quello che voglio. – Dason

1

Immagino che non ci sia modo di memorizzare le impostazioni senza salvarle su disco o su un database, in un modo o nell'altro. Può essere fatto silenziosamente inserendo il codice sotto nel tuo ~/.Rprofile. Tuttavia, se si dispone di pacchetti che salvano le impostazioni in modi diversi dall'uso di options, è necessario aggiungerli manualmente.

So che questo è esattamente quello che hai detto che non volevi, ma potrebbe scatenare almeno un dibattito.

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

Per la mia sorpresa try(..., silent=TRUE) dà un messaggio di avviso all'avvio se ~/.Roptions.Rdata non esiste, che è il motivo per cui ho usato tryCatch invece.

+0

Qualche idea su come fare questo senza richiedere all'utente di modificare il proprio profilo .Rpr? – Dason

+1

Si potrebbe creare un pacchetto per esso e inserire il codice sopra in '.onLoad()' e '. OnUnload()' in 'zzz.R', ma poi avresti ancora bisogno di caricare quel pacchetto ogni volta che avvii R. – Backlin

Problemi correlati