to be clear, swap() from Kmisc specifies the swappees not by index but by 
contents:

        library(Kmisc)
        x <- 11:20
        x <- swap(x, c(2,4), c(4,2))
        # not the desired answer - nothing happened because 2 and 4 weren’t in 
the vector
        [1] 11 12 13 14 15 16 17 18 19 20
        x <- swap(x, c(12,14), c(14,12))
        # probably wanted this
        [1] 11 14 13 12 15 16 17 18 19 20

fwiw, I personally would use mc’s version (x[c(2,4)] <- x[c(4,2)]) but what’s 
most clear depends on your audience, which includes but is never limited to 
you. wrapping in a function with a meaningful name does not hurt. as long as 
you let me take back what I suggested before :) - it has clunkiness of exactly 
the kind that indexing on the left hand side is there to avoid. -e


Le 15 avr. 2014 à 20:45, Michael Shvartsman <[email protected]> a écrit :

> Are you looking for a clever one-liner for clarity or are you looking to 
> avoid copying for memory and performance reasons? In the former case, swap() 
> in Kmisc provides what you want. 
> 
> library(Kmisc)
> 
> x <- 1:10
> x
> x <- swap(x, c(2,3), c(3,2))
> x
> x <- swap(x, c(2,10), c(10,2))
> x
> 
> In the latter case, your best bet is to compile R with 
> --enable-memory-profiling (OSX R does this by default) and use tracemem() and 
> Rprofmem(). 
> 
>     Hope this helps! 
> 
>         Mike.
> 
> 
> On Tue, Apr 15, 2014 at 2:05 PM, João Veríssimo <[email protected]> 
> wrote:
> Perhaps rev() can help?
> 
> Maybe something like:
> 
> x <- c("a", "b", "c")
> c(x[1], rev(x[2:3]))
> 
> João
> On Tue, 2014-04-15 at 17:52 +0000, Hofmeister, Philip wrote:
> > this is probably more appropriate for a general R listserv, but i'm more 
> > likely to get an answer i can decipher here. apologies also for what is 
> > likely a simple fix, but i can't seem to find the right term or syntax to 
> > get this to work without writing ugly code.
> >
> > i want to swap values in a vector, e.g.
> >
> > x <- c(1, 2, 3)
> > [1] 1 2 3
> >
> > and get back
> >
> > 1 3 2
> >
> > i can do this by saving the 2nd or 3rd element of the vector elsewhere, 
> > replacing one of the vector elements (x[3] <- x[2]), and then restoring the 
> > stored value, but that seems wasteful. surely there is a function like 
> > swap() or  std::swap(a, b), but i can't seem to find anything. anyone have 
> > any ideas?
> >
> > ph
> >
> >
> >
> 
> 
> 


Reply via email to