[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:06:33 CET 2012


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 I 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