[R] How to define a variable in a function that another function uses without using global variables

R. Michael Weylandt michael.weylandt at gmail.com
Wed Jan 18 20:15:19 CET 2012


To close things out: credit is due to Thomas L rather than Luke T here:

https://stat.ethz.ch/pipermail/r-help/2011-April/275905.html

Michael

On Wed, Jan 18, 2012 at 2:06 PM, R. Michael Weylandt
<michael.weylandt at gmail.com> wrote:
> And to the OP: note the all-important "y <- NA" that starts off Bill's
> example. That makes a variable "y"  in the local environment so "<<-"
> finds that first before it gets to searching the global environment
> (and possibly assigning there). It's not so important it's an NA just
> that it's initialized.
>
> (There's a great thread where Luke (I think?) talks about how "<<-"
> should really be "super-assignment" rather than "global assignment"
> somewhere in the archives; it explains why this is so important very
> eloquently and was a real eye opener for me on how "<<-" could be
> something other than trouble)
>
> Bill's solution is more flexible/powerful: but if you are setting the
> constant once and plan to forget about it, I think mine will suffice.
>
> Michael
>
> On Wed, Jan 18, 2012 at 1:57 PM, William Dunlap <wdunlap at tibco.com> wrote:
>> Make an environment that the functions share.  One way to do
>> this is with local():
>>
>>> test <- local({ y <- NA
>> +                 f1 <- function(x) x + y
>> +                 f2 <- function(y1) { y <<- y1 ; f1(1) }
>> +                 list(f1=f1, f2=f2) })
>>> test$f2(2^(1:3))
>> [1] 3 5 9
>>
>> (The example you showed must have had a typo in it,
>> as it didn't give the error message you showed.  I
>> assume you typed 'test1(2,y1)' where you meant 'test1(2)'.)
>>
>> Bill Dunlap
>> Spotfire, TIBCO Software
>> wdunlap tibco.com
>>
>>> -----Original Message-----
>>> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of statguy
>>> Sent: Wednesday, January 18, 2012 10:30 AM
>>> To: r-help at r-project.org
>>> Subject: [R] How to define a variable in a function that another function uses without using global
>>> variables
>>>
>>> I would like to know if it is possible to make a function that defines a
>>> variable in another function without setting that variable globally?
>>>
>>> I would i.e. be able to define a variables value inside a function ("one
>>> level above) which another function makes use of, without setting this
>>> variable globally.
>>>
>>> I have provided this very simple illustrating example.
>>>
>>> test1=function(x)
>>>       {
>>>       x+y
>>>       }
>>> test2=function(y1)
>>>       {
>>>       y=y1
>>>       test1(2,y1)
>>>       }
>>>
>>> Running the second function results in an error:
>>> > test2(1)
>>> Error in test1(2) : object 'y' not found
>>>
>>> I see 2 possible solutions to this, but neither of them is preferred in my
>>> more complex situation:
>>>
>>> 1. Setting y<<-y_1 globally in test2-function
>>> 2. making test1 a function of both x and y.
>>>
>>> Is there any other way to do this except from the 2 above? I hope someone
>>> can help me with this.
>>>
>>> --
>>> View this message in context: http://r.789695.n4.nabble.com/How-to-define-a-variable-in-a-function-
>>> that-another-function-uses-without-using-global-variables-tp4307604p4307604.html
>>> Sent from the R help mailing list archive at Nabble.com.
>>>
>>> ______________________________________________
>>> 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.
>>
>> ______________________________________________
>> 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