[R] "no visible binding for global variable" and with() vs. within()

Martin Maechler maechler at stat.math.ethz.ch
Fri Aug 22 11:40:15 CEST 2014

>>>>> Rolf Turner <r.turner at auckland.ac.nz>
>>>>>     on Mon, 18 Aug 2014 08:47:36 +1200 writes:

    > On 17/08/14 23:05, Duncan Murdoch wrote:
    >> On 16/08/2014, 9:36 PM, Daniel Braithwaite wrote:
    >>> R CMD check does not object to this code when checking a
    >>> package:
    >>> foo1 <- function (bar) { with(bar, { x }) }
    >>> but produces a warning:
    >>> foo2: no visible binding for global variable 'x'
    >>> in response to this:
    >>> foo2 <- function (bar) { within(bar, { x }) }
    >>> Is this an R bug, or at least, an inadvertent
    >>> inconsistency?  Here is sessionInfo() from my machine,
    >>> right after starting an interactive session:
    >> I'm not sure, but I suspect it's an intentional
    >> inconsistency.  The code that checks for use of globals
    >> can't do anything in with() or within() code, so bugs can
    >> slip by if you use those.  I think with() had been around
    >> for a long time and was in wide use when that test was
    >> added, but within() is newer, and it was less disruptive
    >> to warn about it, so the warning has been left in.  (I
    >> don't remember whether the test came before or after
    >> within() was introduced.)
    >> So if you want to avoid the warning, don't use within().

    > Or you could have a file, say "melvin.R", in the R
    > directory of your package, containing the line:

    >   utils::globalVariables("x")

Yes,  but that would be a quite bad idea, IMHO:

The checking code {from package 'codetools' BTW}
would no longer warn you about any accidental global 'x'
variable in any of your functions in your package.

After all, these codetools checks *are* very helpful in
detecting typos and thinkos.
Consequently, I'd strongly advise to only use
globalVariables(.) on *rare* variable names.

Martin Maechler, 
ETH Zurich

More information about the R-help mailing list