2012-08-06 17 views
10

Oturumlar arasında belirli bir pakete ilişkin seçenekleri veya bilgileri kaydetmenin kesin bir yolu var mı? Örneğin birisinin bir oyun yaptığını ve bir R paketi olarak serbest bıraktığını varsayalım. Yüksek puanlar kaydetmek istediler ve her seferinde R sıfırlamalarını istemiyorlarsa yeni bir oturum başlattılar, bunun en iyi yolu ne olurdu? Şu anda sadece kullanıcıların giriş dizinindeki bir dosyayı depolamayı düşünebilirim, ancak bu yaklaşımı beğendiğimden emin değilim.Oturum ayarlarını paketler arasında kaydetme

+0

değil bir R paketinin başına için, ancak bu tür depolamak için nix Dünyada oldukça tipik gizli bir dosyada veya kullanıcıların giriş dizinindeki gizli dizinde. Pencerelerde bir uygulama veri dizini veya kayıt defteri kullanabilirsiniz. – frankc

+0

Ben de aynı soruyu kendim aldım, sanırım anahtar bu SO mesajında ​​olabilir: http://stackoverflow.com/questions/8661526/permanently-replacing-a-function –

+0

"Biri bir oyun yaptı ve serbest bıraktı Bir R paketi olarak "<- Errror, –

cevap

4

Bu bir yaklaşım olabilir.

scores <- NA 

Sonra puanları ile paketi oluşturan: bir işlev (bir kukla fonksiyonu olarak bağlı olduğu oluşturmak herhangi bir fonksiyon) ve aşağıdaki gibi bir set scores adı verilen bir veri kümesi olan bir kukla paket oluşturulan veri kümesi.

O zaman kütüphaneyi boş zaman

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

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

Sonra R. içinden veri kümesini değiştirmek için aşağıdaki kullanılan ve şimdi set veri diyor Ağın yüklenen yeniden:

> scores 
[1] 10 

Acaba bu İstediğin şeyi yapmak için değiştirilmek mi? Bir şekilde onu kurtarmak zorunda kalacaksınız ama .Last işlevini karıştırmadan bunu nasıl yapacağınızdan emin değilim.

DÜZENLEME:

Bu bir paket olarak derlemek ve o kadar veri setleri kaydeder tembel yük kullandığınızda bu seçenek o yaşayabilir değildir görünür:

RData.rbd, RData.rbx, .rda dosyaları olarak değil. Bu, yukarıda kullandığım yaklaşımın, otomatik olarak tanınmasını istediğimiz anlamsız olduğu anlamına gelir.

EDIT2 Bu yaklaşım çalışır ve yaptığım bir pakette denedim. Verilerin tembel yükünü yükleyemezsiniz ve açık bir şekilde data(scores)'u kullanmanız veya aradığınız işlevin içinde data(scores)'u kullanmanız gerekir. Ben de scores için .scores int global.env oluşturuldu ve ilk kez oluşturuldu ve görmek için fonksiyonun içinde exists kullanılır. Eğer .scores. Vardı, ben bu işlevin içindeki puanlara verdim. Bir kez kütüphaneyi kaldırdıktan sonra tekrar laod attığınızda bir daha asla endişelenmenize gerek kalmaz.

Belki alternatif burada Josh'un tavsiyesi kullanarak nasılsa değiştirilebilir bir fonksiyonu olarak bu kurtarmaktır: Permanently replacing a function

+0

'.onUnload' üzerinde ne yapıyorsunuz? Denemedim ama R kapalıyken tüm paketler için çalıştırılmalı, değil mi? – Backlin

+3

"Skorlar" her zaman değiştirilebileceği zaman yeniden kaydedebilirsiniz (çok sık olmadığı varsayılarak). O zaman "sonunda" kaydetme konusunda endişelenmenize gerek yok " –

+0

Onunla oynamak zorundayım ama bu istediğimi yapacak gibi görünüyor." – Dason

1

Ayarların, diske veya veritabanına, bir şekilde veya başka bir şekilde kaydetmeden saklanmasının bir yolu yoktur. Yine de aşağıdaki kodu ~/.Rprofile'a ekleyerek sessiz bir şekilde yapılabilir. Ancak, ayarları options'u kullanarak başka yollarla kaydeden paketleriniz varsa, bunları el ile eklemeniz gerekir.

Bunun tam olarak istemediğinizi söylediğinizi biliyorum, ancak en azından bazı tartışmalara yol açabilir. Benim sürpriz try(..., silent=TRUE) için

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

~/.Roptions.Rdata yerine tryCatch kullanılan, bu yüzden de yoksa başlangıçta bir uyarı verir.

+0

Kullanıcının .Rprofile ayarlarını değiştirmesini gerektirmeden bunun nasıl yapılacağı hakkında herhangi bir fikir var mı? – Dason

+1

Bunun için bir paket hazırlayabilir ve yukarıdaki kodu '.onLoad()' ve '.onUnload()' 'zzz.R''üne koyabilirsiniz, ancak daha sonra her seferinde başlattığınız bu paketi yüklemeniz gerekir. – Backlin

İlgili konular