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 [EMAIL PROTECTED] +44 (0)20 8525 0696 http://www.burns-stat.com (home of S Poetry and "A Guide for the Unwilling S User") [EMAIL PROTECTED] 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