Re: [R] priority of operators in the FOR ( ) statement

From: Patrick Burns <pburns_at_pburns.seanet.com>
Date: Tue 23 Aug 2005 - 21:12:20 EST

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@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@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@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@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 Received on Tue Aug 23 21:17:36 2005

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:39:55 EST