Hi, Is it possible to break using if-condition during the recursive function? Here is a function which almost works. It is for inorder-tree-walk. iotw<-function(v,i,Stack,Indexes) # input: a vector and the first index (1), Stack=c(), Indexes=c(). { print(Indexes) # if (sum(i)==0) break # Doesn't work... if (is.na(v[i])==FALSE & is.null(unlist(v[i]))==FALSE) {Stack=c(i,Stack); i=2*i; iotw(v,i,Stack,Indexes)} Indexes=c(Indexes,Stack[1]) Stack=pop.stack(Stack)$vector Indexes=c(Indexes,Stack[1]) i=2*Stack[1]+1 Stack=pop.stack(Stack)$vector iotw(v,i,Stack,Indexes) }> v=c(`-`,`+`,1,`^`,`^`,NA,NA,"X",3,"X",2) > Stack=c() > Indexes=c()> iotw(v,1,Stack,Indexes)NULL NULL NULL NULL NULL [1] 8 4 [1] 8 4 [1] 8 4 9 2 [1] 8 4 9 2 [1] 8 4 9 2 [1] 8 4 9 2 10 5 [1] 8 4 9 2 10 5 [1] 8 4 9 2 10 5 11 1 [1] 8 4 9 2 10 5 11 1 [1] 8 4 9 2 10 5 11 1 3 Error in if (is.na(v[i]) == FALSE & is.null(unlist(v[i])) == FALSE) { : argument is of length zero Regards, Atte Tenkanen University of Turku, Finland
Oh. I forgot one extra-function: pop.stack<-function(v){ if(length(v)==0){x=NA} if(length(v)==1){x=v[1]; v=c()} if(length(v)>1){x=v[1]; v=v[2:length(v)]} return(list(vector=v,x=x)) } Atte> Hi, > > Is it possible to break using if-condition during the recursive > function? > Here is a function which almost works. It is for inorder-tree-walk. > > iotw<-function(v,i,Stack,Indexes) # input: a vector and the first > index (1), Stack=c(), Indexes=c(). > { > print(Indexes) > # if (sum(i)==0) break # Doesn't work... > > if (is.na(v[i])==FALSE & is.null(unlist(v[i]))==FALSE) > {Stack=c(i,Stack); i=2*i; iotw(v,i,Stack,Indexes)} > Indexes=c(Indexes,Stack[1]) > Stack=pop.stack(Stack)$vector > Indexes=c(Indexes,Stack[1]) > i=2*Stack[1]+1 > Stack=pop.stack(Stack)$vector > iotw(v,i,Stack,Indexes) > } > > > > v=c(`-`,`+`,1,`^`,`^`,NA,NA,"X",3,"X",2) > > Stack=c() > > Indexes=c() > > > iotw(v,1,Stack,Indexes) > NULL > NULL > NULL > NULL > NULL > [1] 8 4 > [1] 8 4 > [1] 8 4 9 2 > [1] 8 4 9 2 > [1] 8 4 9 2 > [1] 8 4 9 2 10 5 > [1] 8 4 9 2 10 5 > [1] 8 4 9 2 10 5 11 1 > [1] 8 4 9 2 10 5 11 1 > [1] 8 4 9 2 10 5 11 1 3 > Error in if (is.na(v[i]) == FALSE & is.null(unlist(v[i])) == FALSE) > { : > argument is of length zero > > Regards, > > Atte Tenkanen > University of Turku, Finland >
On 15/07/2007 10:06 AM, Atte Tenkanen wrote:> Hi, > > Is it possible to break using if-condition during the recursive function?You can do if (condition) return(value)> > Here is a function which almost works. It is for inorder-tree-walk. > > iotw<-function(v,i,Stack,Indexes) # input: a vector and the first index (1), Stack=c(), Indexes=c(). > { > print(Indexes) > # if (sum(i)==0) break # Doesn't work...if (sum(i)==0) return(NULL) should work. Duncan Murdoch> > if (is.na(v[i])==FALSE & is.null(unlist(v[i]))==FALSE) > {Stack=c(i,Stack); i=2*i; iotw(v,i,Stack,Indexes)} > Indexes=c(Indexes,Stack[1]) > Stack=pop.stack(Stack)$vector > Indexes=c(Indexes,Stack[1]) > i=2*Stack[1]+1 > Stack=pop.stack(Stack)$vector > iotw(v,i,Stack,Indexes) > } > > >> v=c(`-`,`+`,1,`^`,`^`,NA,NA,"X",3,"X",2) >> Stack=c() >> Indexes=c() > >> iotw(v,1,Stack,Indexes) > NULL > NULL > NULL > NULL > NULL > [1] 8 4 > [1] 8 4 > [1] 8 4 9 2 > [1] 8 4 9 2 > [1] 8 4 9 2 > [1] 8 4 9 2 10 5 > [1] 8 4 9 2 10 5 > [1] 8 4 9 2 10 5 11 1 > [1] 8 4 9 2 10 5 11 1 > [1] 8 4 9 2 10 5 11 1 3 > Error in if (is.na(v[i]) == FALSE & is.null(unlist(v[i])) == FALSE) { : > argument is of length zero > > Regards, > > Atte Tenkanen > University of Turku, Finland > > ______________________________________________ > 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 > and provide commented, minimal, self-contained, reproducible code.