[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