Hi - I'm having a really hard time w/understanding R's get function, and would appreciate any help with this. Specifically, I'm using a for loop to call a function. I'd like the function to have access to the variable being incremented in the for-loop, i.e. t.fn <- function() return( get( "i" ) ) t.fn2 <- function() { for ( i in 1:5 ) cat( t.fn(), "\n" ) } However, I keep getting err msg's from the 'get' function about how it can't find the 'i' variable. I've tried various combinations w/in the get fn, i.e. passing inherits=T (should be the default val according to R's help) and envir=sys.frame(). As I understand it, 'get' should search the enclosing environments, which I assume would be the call-stack of the functions. If not, could someone clarify? Thanks, Peter p.s. when I define t.fn to be: t.fn<- function() { for ( j in sys.nframe():0 ) cat( j,":",ls( sys.frame( j ) ), "\n" ) } and call that in t.fn2(), I do eventually see the 'i' variable, i.e.> t.fn2()2 : j 1 : i 0 : test t.fn t.fn2 t.fn3 [[alternative HTML version deleted]]
Duncan Murdoch
2008-Apr-17 23:25 UTC
[R] Help with using 'get' function and variable scope
On 17/04/2008 5:37 PM, Peter Waltman wrote:> Hi - > > I'm having a really hard time w/understanding R's get function, and would > appreciate any help with this. > > Specifically, I'm using a for loop to call a function. I'd like the > function to have access to the variable being incremented in the for-loop, > i.e. > > t.fn <- function() return( get( "i" ) ) > > t.fn2 <- function() { > for ( i in 1:5 ) > cat( t.fn(), "\n" ) > > } > > However, I keep getting err msg's from the 'get' function about how it can't > find the 'i' variable. > > I've tried various combinations w/in the get fn, i.e. passing inherits=T > (should be the default val according to R's help) and envir=sys.frame(). > > As I understand it, 'get' should search the enclosing environments, which I > assume would be the call-stack of the functions. If not, could someone > clarify?The R Language manual describes this; R uses lexical scope. get() will search the calling environment, and its parent -- which in your case is where t.fn was defined -- and the parent of that environment, etc. The call stack is not searched. There are ways to look up the stack; passing envir=parent.frame() to get will work for your needs. But it's not a natural thing to do in R; it means your t.fn wouldn't work if it was called from anywhere but t.fn2. So why not define it there, and then i would be visible to it without this trickery? I.e. t.fn2 <- function() { t.fn <- function() return( i ) for ( i in 1:5 ) cat( t.fn(), "\n" ) } Duncan Murdoch> > Thanks, > > Peter > > p.s. when I define t.fn to be: > > t.fn<- function() { > for ( j in sys.nframe():0 ) cat( j,":",ls( sys.frame( j ) ), "\n" ) > } > and call that in t.fn2(), I do eventually see the 'i' variable, i.e. >> t.fn2() > 2 : j > 1 : i > 0 : test t.fn t.fn2 t.fn3 > > [[alternative HTML version deleted]] > > ______________________________________________ > 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.
Seemingly Similar Threads
- Behavior or as.environment in function arguments/call (and force() behaviors...)
- [RFC][InlineCost] Modeling JumpThreading (or similar) in inline cost model
- [RFC][InlineCost] Modeling JumpThreading (or similar) in inline cost model
- [RFC][InlineCost] Modeling JumpThreading (or similar) in inline cost model
- [LLVMdev] Proposal : Function Notes