[R] A question about R environment

François Pinard pinard at iro.umontreal.ca
Tue Jan 9 04:11:03 CET 2007


[Tong Wang]

>I created environment "mytoolbox" by : mytoolbox <- 
>new.env(parent=baseenv()).  Is there anyway I put it in the search 
>path?  In a project, I often write some small functions, and load them 
>into my workspace directly, so when I list the objects with ls(), it 
>looks pretty messy.  So I am wondering if it is possible to creat an 
>environment, and put these tools into this environment.  For example, 
>I have functions fun1(), fun2() ... and creat an environment mytoolbox 
>which contains all these functions.  And it should be somewhere in the 
>search path:  ".GlobalEnv" "mytoolbox" "package:methods".

Here is a trick, shown as a fairly simplified copy of my ~/.Rprofile.  
It allows for a few simple functions always available, yet without 
having to create a package, and leaving ls() and any later .RData file 
unencumbered.

The idea is to use local() to prevent any unwanted clutter to leak out 
(my real ~/.Rprofile holds more than shown below and use temporary 
variables), to initialise a list meant to hold a bunch of functions or 
other R things, and to save that list on the search path.

This example also demonstrate a few useful functions for when I read the 
R mailing list.  I often need to transfer part of emails containing
code excerpts within the window where R executes, while removing 
quotation marks, white lines and other noise.  I merely highlight-select 
part of the message with the mouse, and then, within R, do things like:

   xs()   source the highlighted region
   xd()   read in a data.frame
   xm()   read in a matrix
   xe()   evaluate and print an expression
   xv()   read a list of values as a vector

The list above in decreasing order of usefulness (for me).  Except for 
xs(), which has no automatic printout, you may either let the others 
print what they got, or assign their value to some variable.  Arguments 
are also possible, for example like this:

   xd(T)  read in a data.frame when the first line holds column names



if (interactive()) {
    local({

        fp.etc <- list()

        fp.etc$xsel.vector <- function (...) {
            connexion <- textConnection(xselection())
            on.exit(close(connexion))
            scan(connexion, ...)
        }
        fp.etc$xsel.dataframe <- function (...) {
            connexion <- textConnection(xselection())
            on.exit(close(connexion))
            read.table(connexion, ...)
        }
        fp.etc$xsel.matrix <- function (...) {
            connexion <- textConnection(xselection())
            on.exit(close(connexion))
            data.matrix(read.table(connexion, ...))
        }
        fp.etc$xsel.eval <- function (...) {
            connexion <- textConnection(xselection())
            on.exit(close(connexion))
            eval(parse(connexion, ...))
        }
        fp.etc$xsel.source <- function (...) {
            connexion <- textConnection(xselection())
            on.exit(close(connexion))
            source(connexion, ...)
        }

        fp.etc$xselection <- function ()
        {
            lignes <- suppressWarnings(readLines('clipboard'))
            lignes <- lignes[lignes != '']
            stopifnot(length(lignes) != 0)
            marge <- substr(lignes, 1, 1)
            while (all(marge %in% c('>', '+', ':', '|'))
                  || all(marge == ' ')) {
                lignes <- substring(lignes, 2)
                marge <- substr(lignes, 1, 1)
            }
            lignes
        }

        fp.etc$xv <- fp.etc$xsel.vector
        fp.etc$xd <- fp.etc$xsel.dataframe
        fp.etc$xm <- fp.etc$xsel.matrix
        fp.etc$xe <- fp.etc$xsel.eval
        fp.etc$xs <- fp.etc$xsel.source

        attach(fp.etc, warn=FALSE)

    })
}

# vim: ft=r


-- 
François Pinard   http://pinard.progiciels-bpi.ca



More information about the R-help mailing list