Hafen, Ryan P
2012-Nov-01 18:04 UTC
[R] finding global variables in a function containing formulae
I need to find all global variables being used in a function and findGlobals() in the codetools package works quite nicely. However, I am not able to find variables that are used in formulae. Simply avoiding formulae in functions is not an option because I do not have control over what functions this will be applied to. Here is an example to illustrate: library(codetools) xGlobal <- rnorm(10) yGlobal <- rnorm(10) plotFn1 <- function() { plot(yGlobal ~ xGlobal) } plotFn2 <- function() { y <- yGlobal x <- xGlobal plot(y ~ x) } plotFn3 <- function() { plot(xGlobal, yGlobal) } findGlobals(plotFn1, merge=FALSE)$variables # character(0) findGlobals(plotFn2, merge=FALSE)$variables # [1] "xGlobal" "yGlobal" findGlobals(plotFn3, merge=FALSE)$variables # [1] "xGlobal" "yGlobal" I would like to find that plotFn1 also uses globals xGlobal and yGlobal. Any suggestions on how I might do this?
Bert Gunter
2012-Nov-01 20:19 UTC
[R] finding global variables in a function containing formulae
Does ?all.vars ##as in> all.vars(y~x)[1] "y" "x" help? -- Bert On Thu, Nov 1, 2012 at 11:04 AM, Hafen, Ryan P <Ryan.Hafen at pnnl.gov> wrote:> I need to find all global variables being used in a function and findGlobals() in the codetools package works quite nicely. However, I am not able to find variables that are used in formulae. Simply avoiding formulae in functions is not an option because I do not have control over what functions this will be applied to. > > Here is an example to illustrate: > > library(codetools) > > xGlobal <- rnorm(10) > yGlobal <- rnorm(10) > > plotFn1 <- function() { > plot(yGlobal ~ xGlobal) > } > > plotFn2 <- function() { > y <- yGlobal > x <- xGlobal > plot(y ~ x) > } > > plotFn3 <- function() { > plot(xGlobal, yGlobal) > } > > findGlobals(plotFn1, merge=FALSE)$variables > # character(0) > findGlobals(plotFn2, merge=FALSE)$variables > # [1] "xGlobal" "yGlobal" > findGlobals(plotFn3, merge=FALSE)$variables > # [1] "xGlobal" "yGlobal" > > I would like to find that plotFn1 also uses globals xGlobal and yGlobal. Any suggestions on how I might do this? > > ______________________________________________ > 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.-- Bert Gunter Genentech Nonclinical Biostatistics Internal Contact Info: Phone: 467-7374 Website: http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
Hafen, Ryan P
2012-Nov-02 23:27 UTC
[R] finding global variables in a function containing formulae
Thanks. That works if I a have the formula expression handy. But suppose I want a function, findGlobalVars() that takes a function as an argument and finds globals in it, where I have absolutely no idea what is in the supplied function: findGlobalVars <- function(f) { require(codetools) findGlobals(f, merge=FALSE)$variables } findGlobalVars(plotFn1) I would like findGlobalVars() to be able to find variables in formulae that might be present in f. On 11/1/12 1:19 PM, "Bert Gunter" <gunter.berton at gene.com> wrote:>Does > >?all.vars >##as in >> all.vars(y~x) >[1] "y" "x" > >help? > >-- Bert > >On Thu, Nov 1, 2012 at 11:04 AM, Hafen, Ryan P <Ryan.Hafen at pnnl.gov> >wrote: >> I need to find all global variables being used in a function and >>findGlobals() in the codetools package works quite nicely. However, I >>am not able to find variables that are used in formulae. Simply >>avoiding formulae in functions is not an option because I do not have >>control over what functions this will be applied to. >> >> Here is an example to illustrate: >> >> library(codetools) >> >> xGlobal <- rnorm(10) >> yGlobal <- rnorm(10) >> >> plotFn1 <- function() { >> plot(yGlobal ~ xGlobal) >> } >> >> plotFn2 <- function() { >> y <- yGlobal >> x <- xGlobal >> plot(y ~ x) >> } >> >> plotFn3 <- function() { >> plot(xGlobal, yGlobal) >> } >> >> findGlobals(plotFn1, merge=FALSE)$variables >> # character(0) >> findGlobals(plotFn2, merge=FALSE)$variables >> # [1] "xGlobal" "yGlobal" >> findGlobals(plotFn3, merge=FALSE)$variables >> # [1] "xGlobal" "yGlobal" >> >> I would like to find that plotFn1 also uses globals xGlobal and >>yGlobal. Any suggestions on how I might do this? >> >> ______________________________________________ >> 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. > > > >-- > >Bert Gunter >Genentech Nonclinical Biostatistics > >Internal Contact Info: >Phone: 467-7374 >Website: >http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-bio >statistics/pdb-ncb-home.htm
Gabor Grothendieck
2012-Nov-03 09:39 UTC
[R] finding global variables in a function containing formulae
On Thu, Nov 1, 2012 at 2:04 PM, Hafen, Ryan P <Ryan.Hafen at pnnl.gov> wrote:> I need to find all global variables being used in a function and findGlobals() in the codetools package works quite nicely. However, I am not able to find variables that are used in formulae. Simply avoiding formulae in functions is not an option because I do not have control over what functions this will be applied to. > > Here is an example to illustrate: > > library(codetools) > > xGlobal <- rnorm(10) > yGlobal <- rnorm(10) > > plotFn1 <- function() { > plot(yGlobal ~ xGlobal) > } > > plotFn2 <- function() { > y <- yGlobal > x <- xGlobal > plot(y ~ x) > } > > plotFn3 <- function() { > plot(xGlobal, yGlobal) > } > > findGlobals(plotFn1, merge=FALSE)$variables > # character(0) > findGlobals(plotFn2, merge=FALSE)$variables > # [1] "xGlobal" "yGlobal" > findGlobals(plotFn3, merge=FALSE)$variables > # [1] "xGlobal" "yGlobal" > > I would like to find that plotFn1 also uses globals xGlobal and yGlobal. Any suggestions on how I might do this?If this is only being applied to your own functions then we can have a convention when writing them to help it in which we "declare" such variables so that findGlobals can locate them: plotFn1 <- function() { xGlobal; yGlobal plot(yGlobal ~ xGlobal) } findGlobals(plotFn1) -- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com