2012-09-22 71 views
4

這是後續澄清前一個問題,How can I ensure a consistent R environment among different users on the same server?我該如何製作我的R課程香草?

我想從R內輸入「vanilla」R會話。類似於我使用命令R --vanilla啓動R時所獲得的結果。例如,我想編寫一個不被特定用戶的自定義設置所迷惑的腳本。

特別,我想下面的

  • 沒有讀取R的歷史,概況,或環境文件
  • 沒有從以前的會話重新加載數據或對象

help("vanilla")不會返回任何內容,並且我不熟悉自定義設置的範圍以瞭解如何擺脫所有這些設置。

有沒有辦法進入新的香草環境? (?new.env似乎並沒有幫助)

+0

您能澄清您的預期用例嗎?我無法從你的問題中得知,所討論的腳本是從現有R會話還是直接從命令行運行。 – joran

+0

[This link](http://stackoverflow.com/a/12323852/967840)可能是相關 – GSee

+0

@joran我希望爲有問題的腳本確保我可以在腳本中控制的標準環境,與if該腳本從命令行運行或在現有R會話中使用'source'調用;無論如何,我無法確保它將在香草環境中運行。 –

回答

3

你不能只讓你的當前會話香草,但你可以從R內開始新的香草R對話這樣

> .Last <- function() system("R --vanilla") 
> q("no") 

我想你使用上面的代碼可能會遇到問題,因爲在R重新啓動後,腳本的其餘部分將不會執行。使用以下代碼,R在退出之前將運行.Last.Last會告訴它在不讀取站點文件或環境文件的情況下重啓,也不會打印啓動消息。重新啓動後,它將運行你的代碼(以及做一些其他的清理)。

wd <- getwd() 
setwd(tempdir()) 
assign(".First", function() { 
    #require("yourPackage") 
    file.remove(".RData") # already been loaded 
    rm(".Last", pos=.GlobalEnv) #otherwise, won't be able to quit R without it restarting 
    setwd(wd) 
    ## Add your code here 
    message("my code is running.\n") 
}, pos=.GlobalEnv) 

assign(".Last", function() { 
    system("R --no-site-file --no-environ --quiet") 
}, pos=.GlobalEnv) 
save.image() # so we can load it back when R restarts 
q("no") 
+0

您可能需要將代碼放在名爲'.First'的函數中,並將'.First'保存到工作目錄中的'.RData'文件中。否則,它可能不會運行重新啓動後的代碼。 (您還需要刪除'.First'函數中的'.Last',以便稍後可以退出R,而無需重新啓動。)請參閱[鏈接](http://stackoverflow.com/a/ 12323852/967840)我對你的Q – GSee

4

恕我直言,重複性研究互動環節不順利起來。您應該考慮編寫從命令行調用的可執行腳本,而不是從打開的交互式會話中調用。在腳本的頂部添加--vanilla的家當:

#!/path/to/Rscript --vanilla 

如果你的腳本需要讀取輸入(參數或選項),你可以使用?commandArgs或兩個包getopt的一個或optparse從它們解析命令行。

如果用戶確實需要在交互式會話中完成自己的工作,那麼他仍然可以通過system()來調用腳本:腳本仍然會使用自己的香草會話。傳遞輸入和輸出只需要一些額外的工作。

+0

發表了評論+1 - 我喜歡這種方式比David在這裏嘗試做的要好得多。 –

+0

我同意OP在評論中給出的要求,即無論腳本是使用'Rscript'還是''source'運行都不要緊。如果您需要確保R啓動時設置了環境變量,該怎麼辦?例如如果你需要確保設置了'TMPDIR',並且你不能控制用戶的'.Renviron'?這可以在shebang中完成,還是必須在命令行中設置,如「TMPDIR =」〜/ tmp「Rscipt --vanilla」? – GSee

+0

無法對Rscript說話,但可以告訴小動作複製R的行爲,但是在非交互模式下執行。 –