[R] how to access an executing environment?
Spencer Graves
spencer.graves at structuremonitoring.com
Thu May 29 18:12:36 CEST 2014
On 5/29/2014 7:40 AM, Greg Snow wrote:
> I believe that what is happening is that you never run fun1, so no
> environment for fun1 is ever created and therefore x1 is never defined
> with its own environment. You grab the statement y <- x1 from the
> body of fun1, but then tries to evaluate it in the current environment
> (where it cannot find x1).
>
> The reason you cannot find the executing environment for fun1 is
> because it is never created.
Of course. Thanks.
>
> Maybe if you tell us more about what you are trying to accomplish we
> can give better suggestions for how to approach it.
I'm trying to create a system for animation to generate a series
of plots from a function that creates one plot. The current status of
this effort is "animate" in "Ecfun" available on R-Forge
[install.packages("Ecdat", repos="http://R-Forge.R-project.org") or "svn
checkout svn://r-forge.r-project.org/svnroot/ecdat/"].
Since my earlier question, I fixed that problem with " funList
<- as.list(fun)" and then passing funList to eval. Other problems
remained with "op <- par(mar=c(2,2,2,1)); on.exit(par(op)); plot(1)":
First, "op" did not get assigned where it could be found. When I wrote
code to do assignments manually, "on.exit" was executed before "plot".
See below. I can work around this also, but I hope this isn't followed
by yet another problem like this.
Suggestions?
Thanks,
Spencer
fun3 <- function(fun){
funList <- as.list(fun)
bo <- body(fun)
nbo <- length(bo)
for(ib in seq(2, length=nbo-1)){
bi <- bo[[ib]]
print(objects())
print(par('mar'))
if(as.character(bi[[1]])=="<-"){
if(length(bi)==3){
assign(as.character(bi[[2]]),
eval(bi[[3]], funList) )
next
} else {
warning('Possible eval problem in ',
as.character(bi))
}
}
eval(bi, funList)
}
print(objects())
}
funPar <- function(y1=1, y2=2){
op <-par(mar=c(2,2,2,1))
on.exit(par(op))
plot(y1)
}
fun3(funPar)
[1] "bi" "bo" "fun" "funList" "ib" "nbo"
[1] 5.1 4.1 4.1 2.1
[1] "bi" "bo" "fun" "funList" "ib" "nbo" "op"
[1] 2 2 2 1
[1] "bi" "bo" "fun" "funList" "ib" "nbo" "op"
[1] 5.1 4.1 4.1 2.1
[1] "bi" "bo" "fun" "funList" "ib" "nbo" "op"
> On Wed, May 28, 2014 at 6:29 PM, Spencer Graves
> <spencer.graves at structuremonitoring.com> wrote:
>> Hello:
>>
>>
>> I'm writing code to modify a function, and I want to know how to
>> access the executing environment of the function. The example below
>> extracts the body of a function and executes a single line but can't find
>> "x1" in the function's executing environment. How would you suggest fixing
>> this? Thanks, Spencer
>>
>>
>> fun1 <- function(x1=1){
>> y <- x1
>> }
>> fun2 <- function(fun=fun1){
>> bo <- body(fun)
>> bo2 <- bo[[2]]
>> z <- eval(bo2)
>> }
>> tst <- fun2()
>>
>> Error in eval(expr, envir, enclos) : object 'x1' not found
>>>
>> ______________________________________________
>> 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