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

______________________________________________
R-help@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.

Reply via email to