As an alternative to the use of multiple shortcus to gain entry to different R environments on WIndows platforms I would like to suggest the use of two R functions written by my colleague John Miyamoto. I have taken the liberty of attaching their definitions to this message. Their efficient use is based on adopting the following regimen or something like it: (1) at startup attach an .Rdata workspace containing the two functions, say to position 2. This I do in my etc/Rprofile file. (2) then attach one or more .Rdata workspaces to additional positions in the search path. These contain data and/or user-defined functions relevant to the current problem. Position 1 of the search, .GlobalEnv is then used only for sctratchwork. move(obj,pos=3) moves obj from .GlobalEnv to the environent of position 3, saves that environment to the associated .Rdata file, and removes obj from .GlobalEnv. rm.sv(obj,pos=3) removes obj from the environment at position 3 and then saves the remaining objects to the associated .Rdata file. The use of the two keeps the .Rdata files updated. ##Here is the first function move<- function(x, pos=NA, dir="c:/directory name/file name", replace=F) { if (is.na(pos)) dirL _ paste("file:", dir, sep="") else dirL _ search()[pos] if (mode(x) != "character") name _ deparse(substitute(x)) else name _ x # Assign the correct number to tmpos = pos, if it is not already assigned. if (is.na(pos)) { tmp _ search() == dirL if (sum(tmp) < 1) stop(message=paste(dir, "not in search path.")) if (sum(tmp) > 1) { cat("There is more than one directory named", dir, "in the search path.\n", "Set the destination with the pos argument.\n") stop(message = "Execution of move terminated.") } #end of if (sum(tmp) > 1) tmpos _ (1:length(search()))[tmp] } else tmpos _ pos #End of if (is.na(pos)) # Assign the correct directory name to dirN if it is not already assigned. tms _ search()[tmpos] dirN _ substring(tms, 6, nchar(tms)) #-------------------------------------------------- # The next if carries out the move, if this is possible. e.test _ NULL; for (i in 1:length(name)) e.test _ c(e.test, !exists(name[i], env=pos.to.env(tmpos)) ) if ( all(e.test) | replace) { for (i in 1:length(name)) assign(name[i], get(name[i], envir=.GlobalEnv), pos=tmpos) save(list=objects(pos=tmpos, all=T), file=dirN ) rm(list=name, envir=.GlobalEnv) } else { #end if, start else #-------------------------------------------------- # The next code gives warning messages if the move could not be carried out. # Case I: The target directory was specified by dir. if (is.na(pos)) { cat("\n No movement of object was carried out!\n Object(s) ", name[!e.test], " exists in ", dir,".\n\n", 'Add "replace=T" to the move command in order to replace', name[!e.test],"\nin", dir,".\n\n") } else { # Case II: The target directory was specified by pos. cat("\n No movement of object was carried out!\n Object(s) ", name[!e.test], " exists in pos =", pos,".\n\n", 'Add "replace=T" to the move command in order to replace', name[!e.test],"\nin pos =", pos,".\n\n") } } #end of case where object exists in destination directory } #end of function definition -------------------------------------------------- # and here is the second function: rm.sv<- function(x, pos=NA, dir="e:/r/jmm/jmfuns.rda") { if (is.na(pos)) dirL _ paste("file:", dir, sep="") else dirL _ search()[pos] if (mode(x) != "character") name _ deparse(substitute(x)) else name _ x # Assign the correct number to tmpos = pos, if it is not already assigned. if (is.na(pos)) { tmp _ search() == dirL if (sum(tmp) < 1) stop(message=paste(dir, "not in search path.")) if (sum(tmp) > 1) { cat("There is more than one directory named", dir, "in the search path.\n", "Set the destination with the pos argument.\n") stop(message = "Execution of move terminated.") } #end of if (sum(tmp) > 1) tmpos _ (1:length(search()))[tmp] } else tmpos _ pos #End of if (is.na(pos)) # Assign the correct directory name to dirN if it is not already assigned. tms _ search()[tmpos] dirN _ substring(tms, 6, nchar(tms)) #-------------------------------------------------- # The next if carries out the deletion, if this is possible. e.test _ NULL; for (i in 1:length(name)) e.test _ c(e.test, exists(name[i], env=pos.to.env(tmpos)) ) if ( all(e.test) ) { rm(list=name, pos=tmpos) save(list=objects(pos=tmpos, all=T), file=dirN) cat(paste("Deletion completed. Current objects in", dirN, "are:\n") ) print(objects(pos=tmpos, all=T)) } else { #end if, start else #-------------------------------------------------- # The next code gives warning messages if the object does not exist in the target directory. # Case I: The target directory was specified by dir. if (is.na(pos)) { cat("\n No deletion of object was carried out!\n Object ", name[!e.test], " does not exist in ", dir,".\n\n") } else { # Case II: The target directory was specified by pos. cat("\n No deletion of object was carried out!\n Object ", name[!e.test], " does not exist in pos =", pos,".\n\n") } } #end of case where object does not exist in target directory } #end of function definition -------------------------------------------------- ********************************************************** Cliff and/or Pat Lunneborg Temporarily in Salobrena Costa Granada, ESPANA Nov 2002 thru Jan 2003 cliff at ms.washington.edu or lunneborg at attbi.com