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

Henrik Bengtsson hb at biostat.ucsf.edu
Fri Aug 22 20:38:33 CEST 2014


I'm dealing with these type of false NOTEs as:

foo1 <- function (bar) {
   # To please R CMD check
   x <- NULL; rm(list="x")

   with(bar, {
     x })
}

Of course, that may one day break with more clever code inspections.

My $.02

/Henrik

On Fri, Aug 22, 2014 at 2:40 AM, Martin Maechler
<maechler at stat.math.ethz.ch> wrote:
>>>>>> 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
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list