2014-11-09 55 views
4

我幾乎可以肯定我已經閱讀過某處如何執行此操作。不必將當前選項(如工作目錄)保存到一個變量中,而是改變w.d,做一個操作,然後恢復到原來的狀態,在一個類似於「with」的函數中進行相對於attach/detach的操作。工作目錄的解決方案就是我現在需要的,但是可能會有更通用的功能來完成這些工作?或者不是嗎?在R中,使用工作目錄等設置臨時執行操作。

所以說明......現在的方法是:

curdir <- getwd() 
setwd("../some/place") 
# some operation 
setwd(curdir) 

它在我最瘋狂的夢想的方式:我知道我可以寫這樣的功能

with.dir("../some/place", # some operation) 

,我只是有這樣的印象,更容易獲得並可以推廣到其他參數。

由於

+1

也許'?on.exit'會有幫助嗎? – 2014-11-09 05:07:04

+0

感謝你們倆。 – 2014-11-09 05:21:47

回答

5

有一些的r鹼的繪圖函數

op <- par(no.readonly = TRUE) 

# par(blah = stuff) 
# plot(stuff) 

par(op) 

這個慣用語是如此令人難以置信的粗爲能夠完全可移植到options()setwd()

好在它也很容易實現粗包裝:

with_dir <- function(dir, expr) { 
    old_wd <- getwd() 
    setwd(dir) 
    result <- evalq(expr) 
    setwd(old_wd) 
    result 
} 

我與非標準評估沒有嚮導,以便evalq可能是不穩定的莫名其妙。更多關於NSE an old write-up by Lumley以及Wickham's Advanced R,但它是密集的東西,我還沒有把我的頭圍繞它呢。

編輯:每本Bolker的評論因爲,它可能會更好使用on.exit此:

with_dir <- function(dir, expr) { 
    old_wd <- getwd() 
    on.exit(setwd(old_wd)) 
    setwd(dir) 
    evalq(expr) 
} 

從R文檔:

on.exit記錄給出了其作爲論據表達需要在當前函數退出時執行(自然或由於錯誤)。這對重置圖形參數或執行其他清理操作很有用。

+0

感謝您的參考......而且我也發現,功能的替代/評估/解析/ deparse /報價「區域」的整個區域實際上並不容易掌握。 – 2014-11-09 05:06:14

+0

@DominicComtois Hadley的書做得非常好,你只需要非常仔細地閱讀它,實際上通過例子和練習自己(我還沒有完成)。在這種情況下,'evalq'默認在調用'with_dir'的環境中評估它的參數。所以,如果你從另一個函數內部調用'with_dir',我很確定它將在該函數中進行評估,而不是在全局環境中進行評估。 – shadowtalker 2014-11-09 05:13:59

+0

@DominicComtois也是R自己的不一致的術語和功能命名無助於澄清情況。 – shadowtalker 2014-11-09 05:14:40

2

您所描述的內容取決於兩件事:檢測何時進入和離開特定的詞法作用域,以及如何定義在入口和退出時執行的行爲。 Python有這些,稱爲「上下文管理器」。當它被釋放時這是一個大問題,Python的標準庫的許多部分現在像上下文管理器一樣工作,並且必須明確地定義「進入」和「退出」行爲,或者利用一些聰明的繼承方案。

with.default 
function (data, expr, ...) 
eval(substitute(expr), data, enclos = parent.frame()) 
<bytecode: 0x07d02ccc> 
<environment: namespace:base> 

的r with功能工作有點像上下文管理器,因爲它可以很容易地四處傳遞範圍。也就是說,這不會給你免費的「進入」和「退出」操作。特別考慮到當前工作目錄不是當前範圍內的條目,而是R解釋器的狀態,只能通過.Internal屏蔽後面的函數調用來查詢或更改。

您可以很容易地定義自己的對象類型,使其具有類似於上下文管理器的方法,類似於通用函數with,以及爲通常使用的其他類型編寫和註冊方法,但它不是基本R的一部分語言。

相關問題