[R] priority of operators in the FOR ( ) statement
Berton Gunter
gunter.berton at gene.com
Tue Aug 23 17:07:53 CEST 2005
... and there is also Mark Bravington's debug package for more IDE-like
debugging.
-- Bert Gunter
Genentech Non-Clinical Statistics
South San Francisco, CA
"The business of the statistician is to catalyze the scientific learning
process." - George E. P. Box
> -----Original Message-----
> From: r-help-bounces at stat.math.ethz.ch
> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Patrick Burns
> Sent: Tuesday, August 23, 2005 4:12 AM
> To: Ravi.Vishnu at outokumpu.com
> Cc: r-help at stat.math.ethz.ch
> Subject: Re: [R] priority of operators in the FOR ( ) statement
>
> The command that I think is most useful in this situation
> is 'browser()'.
>
> Even a couple decades of programming in the S language
> hasn't yet solved the problem of my fingers typing code that
> doesn't match what I want to happen. I quite consistently have
> a
>
> browser()
>
> call in functions that I write to make sure that what I am assuming
> is the same as what R assumes.
>
>
> Patrick Burns
> patrick at burns-stat.com
> +44 (0)20 8525 0696
> http://www.burns-stat.com
> (home of S Poetry and "A Guide for the Unwilling S User")
>
> Ravi.Vishnu at outokumpu.com wrote:
>
> >Dear All,
> >I spent an entire evening in debugging a small, fairly
> simple program in R
> >- without success. It was my Guru in Bayesian Analysis,
> Thomas Fridtjof,
> >who was able to diagonose the problem. He said that it took
> a long time
> >for him also to locate the problem.
> >This program illustrates in some ways the shortcomings of the error
> >messages that R responds with. In this case, it was quite
> misleading and
> >directs attention to a location far removed the actual
> problem statement.
> >Without any more introductory comments, let me directly discuss the
> >essential problem. I am enclosing the entire program after a brief
> >discussion.
> >
> >The problem arises from the following statement (nr is an integer
> >constant) :
> >for ( i in 1:nr-1) {.......}
> >The unexpected problem (at least for me) is that R reads the above
> >statement as (i in (1:nr)-1) {.....}. This makes i be
> initially as zero
> >which leads to an error because the for loop in R starts from 1. The
> >problem is easily fixed by writing the for loop as ( i in 1:(nr-1))
> >{.......}. This would be an easy problem to fix if R
> directly indicates
> >what the problem is. Instead, it gives mystifying error
> messages which are
> >totally misleading. For example, to the program given below,
> I got the
> >following error message (these point to commands elsewhere
> in the program)
> >:
> >Error in if ((x >= 0) & (x < s2)) return(x/2) else if ((x >=
> s2) & (x < :
> >
> > missing value where TRUE/FALSE needed
> >
> >I would like clarifications on the following points :
> >1. I am just curious to know if the priority of operators in the for
> >statement ( the colon before the minus operator, for example) is a
> >deliberate design decision. I have tested Matlab and found that it
> >interprets my original statement correctly without an extra
> paranthesis.
> >2. Faced with a similiar problem in the future, what is a
> smart way of
> >debugging in R to locate a problem. With this problem, I checked and
> >double checked every single statement in the program, except the for
> >statement because I just did not expect any problem there. I
> have seen
> >that there is a debug package but I have not used it. Can
> such tools be
> >used to locate a problem with greater ease? Can somebody
> give a concrete
> >example (for the following program, for example) of a
> debugging routine.
> >
> >*************************************************************
> ************'
> ># Bayesian Data Analysis
> >## source("M:/programming/Rfolder/Assignments/fortest.txt")
> >
> ># #Remove all objects from the workspace
> >rm(list=ls())
> ># #We will also try to note the time that the program takes
> ># #We will start the clock at starttime
> >starttime <- proc.time()[3];
> >
> >my.function<-function(x) {
> >s2<-sqrt(2);
> >if ((x>=0) & (x<s2)) return(x/2)
> >else
> >if ((x>=s2) & (x<1+s2)) return(0.2)
> >else
> >if ((x>=1+s2) & (x<1.5+s2)) return(0.6)
> >else
> >if ((x>1.5+s2) | (x<0)) return(0)
> >}
> >
> >alphayx<-function(y,x) {
> >fy<-my.function(y)
> >fx<-my.function(x)
> >fyx<-fy/fx
> ># to account for 0/0 division
> >if (is.na(fyx)) fyx<-0
> >#fyx<-ifelse(is.na(fyx),0,fyx);
> >alpha<-min(1,fyx)
> >return(alpha)
> >}
> >
> >sigma<-0.5;
> >#nr is the number of iterations
> >nr<-20
> >x<-numeric(nr);
> >x[1]<-1;
> >t<-1:nr;
> >
> >for (i in 1:nr-1) {
> >xi<-x[i];
> >yi<-rnorm(1,mean=xi,sd=sigma);
> >ui<-runif(1,0,1);
> >ualphai<-alphayx(yi,xi);
> >xn<-ifelse(ui<=ualphai,yi,xi);
> >x[i+1]<-xn;
> >}
> >
> >plot(t,x,type="p")
> >
> >endtime<-proc.time()[3];
> >elapsedTime<-endtime-starttime;
> >cat("Elapsed time is", elapsedTime, "seconds", "\n")
> >*************************************************************
> ****************'
> >
> >
> >
> >
> >This message is meant for the addressee only and may contain
> >confidential and legally privileged information. Any unauthorised
> >review, use, copying, storage, disclosure or distribution of this e-
> >mail and any attachments is strictly prohibited. If you are not the
> >named recipient or have otherwise received this communication in
> >error, please destroy this message from your system and
> kindly notify
> >the sender by e-mail. Thank you for your co-operation.
> >
> > [[alternative HTML version deleted]]
> >
> >______________________________________________
> >R-help at stat.math.ethz.ch mailing list
> >https://stat.ethz.ch/mailman/listinfo/r-help
> >PLEASE do read the posting guide!
> http://www.R-project.org/posting-guide.html
> >
> >
> >
> >
> >
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide!
> http://www.R-project.org/posting-guide.html
>
More information about the R-help
mailing list