On Fri, May 4, 2012 at 3:06 PM, Luis Goncalves <lgoncalves at gmail.com>
wrote:>
>
> On May 2 2011, 3:02?pm, Kenn Konstabel <lebats... at gmail.com>
wrote:
>> On Mon, May 2, 2011 at 2:19 PM, abhagwat <bhagwatadi... at
gmail.com> wrote:
>> > Well, what would be really helpful is to restrict the scope of all
>> > non-function variables, but keep a global for scope of all
function
>> >variables. Then, you still have access to all loaded functions, but
you
>> > don't mix upvariables.
>>
>> > How would one do that?
>>
>> But what's the real motivation for this? It could be useful for
>> ensuring that there are no unexpectedglobalvariablesin your code
>> but you can do it using findGlobals in codetools package.
>>
>> fun <- function() mean(x)
>> findGlobals(fun, merge=FALSE)
>>
>> Kenn
>>
>
> Kenn,
>
> I tried your method :
>
> ? ? ?library(codetools)
>
> ? ? ?square <- function (x) {
> ? ? ? ? ?y^2
> ? ? ?}
>
> ? ? ?y <- c(1, 3, 5, 9)
>
> ? ? ?square_without_globals <- function (x) {
> ? ? ? ? ?y^2
> ? ? ?}
>
> ? ? ?findGlobals(square_without_globals, merge=FALSE)
>
> but still get global variables in ?square_without_globals():
>
> ? ? ?> source('R_test_block_global_variables.R')
> ? ? ?> y
> ? ? ?[1] 1 3 5 9
> ? ? ?> square(7)
> ? ? ?[1] ?1 ?9 25 81
> ? ? ?> square_without_globals(7)
> ? ? ?[1] ?1 ?9 25 81
>
> What have I done wrong?
findGlobals helps you find the global variables in a function but it
does nothing with them. That is, it shows you something *about* a
function but does nothing *with* a function.
findGlobals(square_without_globals, merge=FALSE)
shows you that you use 3 global variables in your function:
$functions
[1] "^" "{"
$variables
[1] "y"
Now it's up 2 you how you use this information. You would probably
like to use ^ and { (global variables) in your function but maybe not
y. So you can edit your function and leave y out or add y as an
argument.
> (PS: I am an R novice, coming from the Matlab world. In Matlab, you
> have to declare global variables to be used in a function explicitly.
> Isn't it good programming practice (in ANY language) to NOT allow
> global variable visibility as a default? Leads to a lot less hard-to-
> find bugs!!!)
Yes but ... in R, functions are also "variables", and you would
probably like some "global" functions (`+` or `(`) to be visible. You
can modify your function's environment so that it would access only
functions from certain packages (e.g base) and/or nothing from the
global workspace; that is what is done when functions are included in
packages.
Otherwise, I agree that it is best to avoid global variables and when
you use them, they should be "declared":
square <- function (x) {
# beware! y is used here as a "global variable"
y^2
}