From winstonchang1 at gmail.com  Tue Aug  5 21:47:36 2014
From: winstonchang1 at gmail.com (Winston Chang)
Date: Tue, 5 Aug 2014 14:47:36 -0500
Subject: [Rd] Is it a good idea or even possible to redefine attach?
In-Reply-To: <CAAjq1mfLzRdcYRb4waXBYx6t7h6rr7u0rkJDCGgySf9LaSYi2A@mail.gmail.com>
References: <CAAjq1mfLzRdcYRb4waXBYx6t7h6rr7u0rkJDCGgySf9LaSYi2A@mail.gmail.com>
Message-ID: <CAFOpNVHMjWx0rO-uzsp-s0m3iGKGXO_fzNfSe2p92WcHdy4t7w@mail.gmail.com>

On Tue, Aug 5, 2014 at 1:49 PM, Grant Rettke <gcr at wisdomandwonder.com> wrote:
>
> Hi,
>
> Today I got curious about whether or not I /could/ remove `attach' from
> my system so:
> - Backed it up
> - Implemented a new one
> - Like this
>
> ,----
> | attach.old <<- attach
> | attach <<- function(...) {stop("NEVER USE ATTACH")}
> `----
>
> I got the error:
>
> ,----
> | Error: cannot change value of locked binding for 'attach'
> `----
>
> If I unlock `attach' I assume that I could stomp on it... however is
> that even a good idea?
>
> What will I break?


If you change the base package environment's copy of `attach` (via
`as.environment('package:base')`) , probably not much will break,
except for your own code. If, on the other hand, you change the base
namespace's copy of `attach` (via `asNamespace('base')`, any package
that's subsequently loaded and uses `attach` would run into problems.
Still, either way is probably not a good idea.

I agree with Ista: assigning it yourself in the the global environment
is a better idea. If you want to keep your global env clear of stuff
like this, you can put it in an environment and attach that
environment as a parent of global:

e <- new.env()
e$attach <-  function(...) {stop("NEVER USE ATTACH")}
base::attach(e, name = "my_stuff", warn.conflicts = FALSE)

# Test it out:
attach()

# You can see that the "my_stuff" env is the parent of global env
search()


-Winston



[Rd] Is it a good idea or even possible to redefine attach?
Winston Chang