2012-08-06 60 views
10

有沒有確定的方法來保存與會話之間的某個包有關的選項或信息?在會話之間保存包設置

例如說某人由遊戲,它釋放的R包。如果他們想要保存高分,並且每次R開始新的會話時都不讓他們重置,那麼最好的方法是什麼?目前我只能想到將文件存儲在用戶主目錄中,但我不確定是否喜歡這種方法。

+0

不用於R包本身,而是它是相當典型的在尼克斯世界存儲這種在用戶主目錄中的隱藏文件或隱藏目錄中的東西。在Windows上,您可以使用應用程序數據目錄或註冊表。 – frankc 2012-08-06 19:29:48

+0

我自己也有同樣的問題,我認爲他的關鍵可能是在這個SO帖子在這裏:http://stackoverflow.com/questions/8661526/permanently-replacing-a-function – 2012-08-06 19:56:47

+0

「有人做了一個遊戲,併發布它作爲R包「< - Errror,不解析 – 2012-08-06 20:25:24

回答

4

這可能是一種方法。我創建一個虛擬包的虛擬功能(I創建註定是一個虛擬函數的任何函數)和一個數據組我稱爲scores我設置如下:

​​

然後我創建的包與所述得分數據集。

然後我用下面的數據集從內部改變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函數。

編輯:

看來,當你編譯一個包,並使用延遲加載它保存的數據集作爲這個選項並不是在可行的:

RData.rbd,RData.rbx,不是.rda文件。這意味着我在上面使用的方法有點不值錢,因爲我們希望它能夠被自動識別。

EDIT2 這種方法的工作原理,我試了它在我做的包。您不能執行數據的延遲加載,並且您必須明確使用data(scores)或在您要調用的函數內部使用data(scores)。我也分配了scores.scores int global.env它第一次創建並在函數內部使用exists來查看它是否存在。如果.scores。我已將它分配給函數中的分數。一旦你卸載了圖書館並再次出現,你再也不用擔心了。

可能的替代方案是在這裏使用Josh的意見,這個保存爲某種程度上可以改變的功能:Permanently replacing a function

+0

你對'.onUnload'有什麼看法?我沒有嘗試過,但應該在R關閉時運行所有軟件包,對不對? – Backlin 2012-08-06 20:20:01

+3

您可以隨時在被修改時重新保存'scores'(假設不是很經常)。那麼你不必擔心將它保存「最後」 – 2012-08-06 20:21:05

+0

我得玩弄它,但這似乎會做我想做的。 – Dason 2012-08-06 20:44:54

1

我想有沒有辦法保存設置,而無需將它們保存到磁盤或者數據庫,這種或那種方式。可以通過將代碼放在下面的代碼~/.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(...){}) 
} 

讓我吃驚的try(..., silent=TRUE)給出了啓動時警告,如果~/.Roptions.Rdata不存在,這就是爲什麼我用tryCatch代替。

+0

有關如何在不需要用戶修改其.Rprofile的情況下執行此操作的任何想法? – Dason 2012-08-06 20:09:21

+1

你可以爲它創建一個包,並將上面的代碼放在'zzz.R'的'.onLoad()'和'.onUnload()'中,但是每次啓動R時都需要加載該包。 – Backlin 2012-08-06 20:14:32