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
}