[R-lang] Re: swapping values without temporary storage
Ewan Dunbar
ewan.dunbar@alumni.utoronto.ca
Tue Apr 15 13:27:05 PDT 2014
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 <mshvarts@umich.edu> 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 <jl.verissimo@gmail.com> 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
> >
> >
> >
>
>
>
More information about the ling-r-lang-L
mailing list