Dear Peter, Thomas, et al.,

In the spirit of programming exercises, here's a recursive solution:

insert.values <- function(vector, after, values){
    where <- which(vector == after)[1]
    if (is.na(where)) vector
    else c(vector[1:where], values,
        Recall(vector[-(1:where)], after, values))
    }
insert.values(a, "3", "7")

Regards,
 John

At 08:11 PM 2/17/2003 +0100, Peter Dalgaard BSA wrote:
Thomas Lumley <[EMAIL PROTECTED]> writes:

>   N<-length(a)
>   threes<- a==3
>   offset<- c(0,cumsum(threes)[-N])
>   a[offset+(1:N)]<-a
>   a[which(threes)+offset[threes]+1]<-7
>
> for a more vectorised version.  Equally ugly, but understanding
> these two solutions is probably educational.
>
> Adding elements in the middle is something vectors are not good at, in
> contrast to (pair-based or linked) lists.

Extra exercises for the over-achievers:

1) Show that

offset <- cumsum(threes) - threes

also works.

2) Show that the index in the last line is the same as

which(threes)+seq(length=sum(threes))
-----------------------------------------------------
John Fox
Department of Sociology
McMaster University
Hamilton, Ontario, Canada L8S 4M4
email: [EMAIL PROTECTED]
phone: 905-525-9140x23604
web: www.socsci.mcmaster.ca/jfox
-----------------------------------------------------

______________________________________________
[EMAIL PROTECTED] mailing list
http://www.stat.math.ethz.ch/mailman/listinfo/r-help

Reply via email to