Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In R, do an operation temporarily using a setting such as working directory

Tags:

r

I'm almost certain I've read somewhere how to do this. Instead of having to save the current option (say working directory) to a variable, change the w.d, do an operation, and then revert back to what it was, doing this inside a function akin to "with" relative to attach/detach. A solution just for working directory is what I need now, but there might be a more generic function that does that sort of things? Or ain't it?

So to illustrate... The way it is now:

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

The way it is in my wildest dreams:

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

I know I could write a function for this, I just have the impression there's something more readily available and generalizable to other parameters too.

Thanks

like image 758
Dominic Comtois Avatar asked Nov 09 '14 04:11

Dominic Comtois


People also ask

Which function is used for setting the working directory in R?

It's also possible to use the R function setwd(), which stands for “set working directory”. Note that, if you want to know your current (or default) R working directory, type the command getwd(), which stands for “get working directory”.

What are working directories in R?

The working directory is just a file path on your computer that sets the default location of any files you read into R, or save out of R. In other words, a working directory is like a little flag somewhere on your computer which is tied to a specific analysis project.

Which command is used in R for showing the path of the file?

R” by using file. path(). You can use file. path() to construct file and directory paths that are independent of the operating system your R code is running on.


1 Answers

There is an idiom for this in some of R's base plotting functions

op <- par(no.readonly = TRUE)

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

par(op)

that is so unbelievably crude as to be fully portable to options() and setwd().

Fortunately it's also easy to implement a crude wrapper:

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

I'm no wizard with nonstandard evaluation so evalq could be unstable somehow. More on NSE in an old write-up by Lumley and also in Wickham's Advanced R, but it's dense stuff and I haven't wrapped my head around it all yet.

edit: as per Ben Bolker's comment, it's probably better to use on.exit for this:

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

From the R docs:

on.exit records the expression given as its argument as needing to be executed when the current function exits (either naturally or as the result of an error). This is useful for resetting graphical parameters or performing other cleanup actions.

like image 116
shadowtalker Avatar answered Sep 21 '22 23:09

shadowtalker