[Rd] assignInNamespace to create a setwd() replacement: how to use unlockBinding()?

Michael Friendly friendly at yorku.ca
Thu Feb 7 22:49:20 CET 2013

In my .Rprofile for Windows, I had the following functions defined to 
mirror a few features
I miss from linux:

(a) replace setwd() with a version that stashes the current directory so 
it can be easily restored
(b) writes a short version of the current R directory to the Windows 
title bar: I can always see where I am,
with multiple Rgui windows.
(c) creates a cd() shorthand for setwd(), but with the difference that 
cd() acts like cd - under the tcsh shell,
returning to the previously stored directory.

#### setwd-new.R ######
# .Rprofile functions to set current directory in WindowTitle

# setwd() replacement functions

oldsetwd <- base::setwd
function(dir) {
.lastdir <<- oldsetwd(dir)
utils::setWindowTitle( short.path(base::getwd()) )
}, "base")

# setwd replacement, allowing cd() to be like 'cd -' on unix (return to 
last dir)
cd <- function(dir) {
if(missing(dir)) dir <- .lastdir
.lastdir <<- base::setwd(dir)
utils::setWindowTitle( short.path(base::getwd()) )

short.path <- function(dir, len=2) {
np <-length(parts <- unlist(strsplit(dir, '/')))
parts <-rev( rev(parts)[1:min(np,len)] )
dots <- ifelse (np>len, '...', '')
paste(dots,paste(parts, '/', sep='', collapse=''))

These all worked for all R versions up to R 2.15.0, where it began to 
break as follows:

 > source("setwd-new.R")
Error in utils::assignInNamespace("setwd", function(dir) { :
locked binding of ‘setwd’ cannot be changed

I understand what the error means, and I think that unlockBinding() 
somewhere in my code gives a solution,
but I don't see where or how.

I should also add that in my actual .Rprofile, I source these functions 
into a local environment & attach
so they are always available, but don't clutter up ls()

.my.env <- local({
# all my local definitions

Michael Friendly     Email: friendly AT yorku DOT ca
Professor, Psychology Dept. & Chair, Quantitative Methods
York University      Voice: 416 736-2100 x66249 Fax: 416 736-5814
4700 Keele Street    Web:   http://www.datavis.ca
Toronto, ONT  M3J 1P3 CANADA

More information about the R-devel mailing list