2014-11-09 70 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的一部分语言。