> It seems so inefficient. But ifelse knows nothing about the expressions given as its second and third arguments -- it only sees their values after they are evaluated. Even if it could see the expressions, it would not be able to assume that f(x[i]) is the same as f(x)[i] or things like ifelse(x>0, cumsum(x), cumsum(-x)) would not work.
You can avoid the computing all of f(x) and then extracting a few elements from it by doing something like x <- c("Wednesday", "Monday", "Wednesday") z1 <- character(length(x)) z1[x=="Monday"] <- "Mon" z1[x=="Tuesday"] <- "Tue" z1[x=="Wednesday"] <- "Wed" or LongDayNames <- c("Monday","Tuesday","Wednesday") ShortDayNames <- c("Mon", "Tue", "Wed") z2 <- character(length(x)) for(i in seq_along(LongDayNames)) { z2[x==LongDayNames[i]] <- ShortDayNames[i] } To avoid the repeated x==value[i] you can use match(x, values). z3 <- ShortDayNames[match(x, LongDayNames)] z1, z2, and z3 are identical character vectors. Or, you can use factors. > factor(x, levels=LongDayNames, labels=ShortDayNames) [1] Wed Mon Wed Levels: Mon Tue Wed Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com > -----Original Message----- > From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On > Behalf > Of Bill > Sent: Monday, December 02, 2013 4:50 PM > To: Duncan Murdoch > Cc: r-help@r-project.org > Subject: Re: [R] ifelse -does it "manage the indexing"? > > It seems so inefficient. I mean the whole first vector will be evaluated. > Then if the second if is run the whole vector will be evaluated again. Then > if the next if is run the whole vector will be evaluted again. And so on. > And this could be only to test the first element (if it is false for each > if statement). Then this would be repeated again and again. Is that really > the way it works? Or am I not thinking clearly? > > > On Mon, Dec 2, 2013 at 4:48 PM, Duncan Murdoch > <murdoch.dun...@gmail.com>wrote: > > > On 13-12-02 7:33 PM, Bill wrote: > > > >> ifelse ((day_of_week == "Monday"),1, > >> ifelse ((day_of_week == "Tuesday"),2, > >> ifelse ((day_of_week == "Wednesday"),3, > >> ifelse ((day_of_week == "Thursday"),4, > >> ifelse ((day_of_week == "Friday"),5, > >> ifelse ((day_of_week == "Saturday"),6,7))))))) > >> > >> > >> In code like the above, day_of_week is a vector and so day_of_week == > >> "Monday" will result in a boolean vector. Suppose day_of_week is Monday, > >> Thursday, Friday, Tuesday. So day_of_week == "Monday" will be > >> True,False,False,False. I think that ifelse will test the first element > >> and > >> it will generate a 1. At this point it will not have run day_of_week == > >> "Tuesday" yet. Then it will test the second element of day_of_week and it > >> will be false and this will cause it to evaluate day_of_week == "Tuesday". > >> My question would be, does the evaluation of day_of_week == "Tuesday" > >> result in the generation of an entire boolean vector (which would be in > >> this case False,False,False,True) or does the ifelse "manage the indexing" > >> so that it only tests the second element of the original vector (which is > >> Thursday) and for that matter does it therefore not even bother to > >> generate > >> the first boolean vector I mentioned above (True,False,False,False) but > >> rather just checks the first element? > >> Not sure if I have explained this well but if you understand I would > >> appreciate a reply. > >> > > > > See the help for the function. If any element of the test is true, the > > full first vector will be evaluated. If any element is false, the second > > one will be evaluated. There are no shortcuts of the kind you describe. > > > > Duncan Murdoch > > > > > > [[alternative HTML version deleted]] > > ______________________________________________ > 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. ______________________________________________ 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.