Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 724671
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 14, 20262026-05-14T06:14:58+00:00 2026-05-14T06:14:58+00:00

My question is about avoiding namespace pollution when writing modules in R. Right now,

  • 0

My question is about avoiding namespace pollution when writing modules in R.

Right now, in my R project, I have functions1.R with doFoo() and doBar(), functions2.R with other functions, and main.R with the main program in it, which first does source('functions1.R'); source('functions2.R'), and then calls the other functions.

I’ve been starting the program from the R GUI in Mac OS X, with source('main.R'). This is fine the first time, but after that, the variables that were defined the first time through the program are defined for the second time functions*.R are sourced, and so the functions get a whole bunch of extra variables defined.

I don’t want that! I want an “undefined variable” error when my function uses a variable it shouldn’t! Twice this has given me very late nights of debugging!

So how do other people deal with this sort of problem? Is there something like source(), but that makes an independent namespace that doesn’t fall through to the main one? Making a package seems like one solution, but it seems like a big pain in the butt compared to e.g. Python, where a source file is automatically a separate namespace.

Any tips? Thank you!

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-14T06:14:58+00:00Added an answer on May 14, 2026 at 6:14 am

    The main function you want to use is sys.source(), which will load your functions/variables in a namespace (“environment” in R) other than the global one. One other thing you can do in R that is fantastic is to attach namespaces to your search() path so that you need not reference the namespace directly. That is, if “namespace1” is on your search path, a function within it, say “fun1”, need not be called as namespace1.fun1() as in Python, but as fun1(). [Method resolution order:] If there are many functions with the same name, the one in the environment that appears first in the search() list will be called. To call a function in a particular namespace explicitly, one of many possible syntaxes – albeit a bit ugly – is get("fun1","namespace1")(...) where ... are the arguments to fun1(). This should also work with variables, using the syntax get("var1","namespace1"). I do this all the time (I usually load just functions, but the distinction between functions and variables in R is small) so I’ve written a few convenience functions that loads from my ~/.Rprofile.

      name.to.env <- function(env.name)
        ## returns named environment on search() path
        pos.to.env(grep(env.name,search()))
    
      attach.env <- function(env.name)
        ## creates and attaches environment to search path if it doesn't already exist
        if( all(regexpr(env.name,search())<0) ) attach(NULL,name=env.name,pos=2)
    
      populate.env <- function(env.name,path,...) {
        ## populates environment with functions in file or directory
        ## creates and attaches named environment to search() path 
        ##        if it doesn't already exist
        attach.env(env.name)
        if( file.info(path[1])$isdir )
          lapply(list.files(path,full.names=TRUE,...),
                 sys.source,name.to.env(env.name)) else
        lapply(path,sys.source,name.to.env(env.name))
        invisible()
      }
    

    Example usage:

    populate.env("fun1","pathtofile/functions1.R")
    populate.env("fun2","pathtofile/functions2.R")
    

    and so on, which will create two separate namespaces: “fun1” and “fun2”, which are attached to the search() path (“fun2” will be higher on the search() list in this case). This is akin to doing something like

    attach(NULL,name="fun1")
    sys.source("pathtofile/functions1.R",pos.to.env(2))
    

    manually for each file (“2” is the default position on the search() path). The way that populate.env() is written, if a directory, say “functions/”, contains many R files without conflicting function names, you can call it as

    populate.env("myfunctions","functions/")
    

    to load all functions (and variables) into a single namespace. With name.to.env(), you can also do something like

    with(name.to.env("fun1"), doStuff(var1))
    

    or

    evalq(doStuff(var1), name.to.env("fun1"))
    

    Of course, if your project grows big and you have lots and lots of functions (and variables), writing a package is the way to go.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a question about using streams in .NET to load files from disk.
I have a question about best practices regarding how one should approach storing complex
I have a curious question about efficiency. Say I have a field on a
I have a question about locking. This doesn't have to be only about record
My question about the reconfiguration delay when switching between Access 2003 and 2007 the
I recently asked a question about IIf vs. If and found out that there
I was reading this question about how to parse URLs out of web pages
I recently asked a question about what I called method calls. The answer referred
I recently asked a question about Oracle Encryption. Along the way to finding a
Following Izb's question about Best binary XML format for JavaME , I'm looking for

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.