# How to insert elements into a vector?

### Question

I have a logical vector, for which I wish to insert new elements at particular indexes. I've come up with a clumsy solution below, but is there a neater way?

``````probes <- rep(TRUE, 15)
ind <- c(5, 10)
probes.2 <- logical(length(probes)+length(ind))
probes.ind <- ind + 1:length(ind)
probes.original <- (1:length(probes.2))[-probes.ind]
probes.2[probes.ind] <- FALSE
probes.2[probes.original] <- probes

print(probes)
``````

gives

`````` TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
``````

and

``````print(probes.2)
``````

gives

``````  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
  TRUE  TRUE  TRUE  TRUE  TRUE
``````

So it works but is ugly looking - any suggestions?

1
41
4/12/2014 10:15:10 PM

You can do some magic with indexes:

First create vector with output values:

``````probs <- rep(TRUE, 15)
ind <- c(5, 10)
val <- c( probs, rep(FALSE,length(ind)) )
# > val
#    TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#   TRUE  TRUE  TRUE FALSE FALSE
``````

Now trick. Each old element gets rank, each new element gets half-rank

``````id  <- c( seq_along(probs), ind+0.5 )
# > id
#    1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0  9.0 10.0 11.0 12.0 13.0 14.0 15.0
#   5.5 10.5
``````

Then use `order` to sort in proper order:

``````val[order(id)]
#    TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
#   TRUE  TRUE  TRUE  TRUE  TRUE
``````
35
9/29/2009 10:04:24 PM

These are all very creative approaches. I think working with indexes is definitely the way to go (Marek's solution is very nice).

I would just mention that there is a function to do roughly that: `append()`.

``````probes <- rep(TRUE, 15)
probes <- append(probes, FALSE, after=5)
probes <- append(probes, FALSE, after=11)
``````

Or you could do this recursively with your indexes (you need to grow the "after" value on each iteration):

``````probes <- rep(TRUE, 15)
ind <- c(5, 10)
for(i in 0:(length(ind)-1))
probes <- append(probes, FALSE, after=(ind[i+1]+i))
``````

Incidentally, this question was also previously asked on R-Help. As Barry says:

"Actually I'd say there were no ways of doing this, since I dont think you can actually insert into a vector - you have to create a new vector that produces the illusion of insertion!"