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