[R] Environmental problems.

Rolf Turner r.turner at auckland.ac.nz
Tue Feb 25 09:08:45 CET 2014


I have a function that makes use of the ode() function from the 
"deSolve" package.  I am trying to find a way of getting it to put out a 
"progress report" every "t.int" time units (by "progress report" I just 
mean reporting what time it's got up to).

I thought to put code something like the following in my "func" function 
that gets called by (is an argument to) ode():

> cat("Before: time =",tt,"tdone =",tdone,"diff =",tt-tdone,"\n")
> if(tt - tdone >= 0.1-sqrt(.Machine$double.eps)) {
>     cat("Prog. Rep.: time =",tt,"tdone =",tdone,"diff =",tt-tdone,"\n")
>     assign("tdone",tt,envir=parent.env(environment()))
> }
> cat("After: time =",tt,"tdone =",tdone,"diff =",tt-tdone,"\n")

The object "tdone" gets initialized (to 0) outside of func(), so there 
is not a problem with "tdone" not being found the first time that func() 
gets called by ode().  (I'm hardwiring "t.int=0.1" in the forgoing just 
for test/illustration purposes.)  The "Before" and "After" cat()-s are 
there to demonstrate what goes wrong.

What goes wrong is that I get no progress report and tdone remains equal 
to 0 until tt reaches 0.1. As desired. I then get a progress report and 
tdone gets set equal to the first value of tt which is greater than 0.1. 
As desired.

Then I get no further progress reports and tdone gets set equal to tt at 
every call to func() --- even though tt - tdone = 0 which is less than 
0.1 so the assignment of tdone cannot occur.  And yet it does, keeping 
the difference equal to 0.  (*Not* as desired!)

So the function is recognizing that the difference is less than 0.1 in 
that it does not execute the cat() statement.  Yet it executes the 
assign() statement.  This is clearly impossible! :-)  But it happens.

The output from the cat()-ing, around time = 0.1, looks like:

> Before: time = 0.09364548 tdone = 0 diff = 0.09364548
> After: time = 0.09364548 tdone = 0 diff = 0.09364548
> Before: time = 0.0975779 tdone = 0 diff = 0.0975779
> After: time = 0.0975779 tdone = 0 diff = 0.0975779
> Before: time = 0.0975779 tdone = 0 diff = 0.0975779
> After: time = 0.0975779 tdone = 0 diff = 0.0975779
> Before: time = 0.09698997 tdone = 0 diff = 0.09698997
> After: time = 0.09698997 tdone = 0 diff = 0.09698997
> Before: time = 0.1009224 tdone = 0 diff = 0.1009224
> Prog. Rep.: time = 0.1009224 tdone = 0 diff = 0.1009224
> After: time = 0.1009224 tdone = 0.1009224 diff = 0
> Before: time = 0.1009224 tdone = 0.1009224 diff = 0
> After: time = 0.1009224 tdone = 0.1009224 diff = 0
> Before: time = 0.1003344 tdone = 0.1003344 diff = 0  <--------------|
> After: time = 0.1003344 tdone = 0.1003344 diff = 0
> Before: time = 0.1042669 tdone = 0.1042669 diff = 0
> After: time = 0.1042669 tdone = 0.1042669 diff = 0

It's at that line indicated by "<----|", 4 lines from the bottom of the 
forgoing display, where things go to hell in a handcart.  Why (how on 
earth can) tdone change from 0.1009224 to 0.1003344, given that the 
difference is 0 whence no assignment of tdone should take place?

What am I not seeing?  Can anyone help me out?  I'm going mad! 
***MAD*** I tell you! :-)

Suggestions as to a better way of accomplishing my desired goal of
producing progress reports would also be welcome.

I am not at all sure that assigning "tdone" in parent.env(environment()) 
is the right thing to do.  I need to assign it in such a way and in such 
a location that its value will persist
from call to call of "func".  Words of wisdom about this would be 
gratefully received.  (I don't really grok environments.  I just try 
things until *something* works!)

cheers,

Rolf Turner



More information about the R-help mailing list