[R] inplace assignment: solution

David Hugh-Jones davidhughjones at gmail.com
Tue Jun 20 11:32:37 CEST 2006


I worked this out over the weekend. I appreciate that using temporary
variables would be simpler but I think this makes for quite readable
code:

# in RProfile.site
inplace <- function (f, arg=1)
		eval.parent(call("<-",substitute(f)[[arg+1]], f),2)


# examples in code

inplace(foo[bar,baz] *2)
# or
inplace(paste(foo[bar,baz], 1:10))
# or
inplace(sub("blah", "bleh", foo[bar,baz]), 3)


cheers
Dave


On 16/06/06, David Hugh-Jones <davidhughjones at gmail.com> wrote:
> It's more a general point about having to write things out twice when
> you do assignments. I could also have written:
>
> data.frame[some.condition & another.condition, big.list.of.columns] <-
> data.frame[some.condition & another.condition,  big.list.of.columns] * 2 + 55
>
> or anything else. Equally, there could be any method of subsetting, or
> any expression that can be an assignment target, on the left hand
> side:
>
> data.frame[[some.complex.expression.for.columnames]]
> <-data.frame[[some.complex.expression.for.columnames]] * 333 + foo *
> 56
>
> rownames(matrix)[45:53] <- paste(rownames(matrix)[45:53], "blah")
>
>
> David
>
> On 16/06/06, Adaikalavan Ramasamy <ramasamy at cancer.org.uk> wrote:
> > I do not fully understand your question but how about :
> >
> >  inplace <- function( df, cond1, cond2, cols, suffix ){
> >
> >   w  <- which( cond1 & cond2 )
> >   df <- df[ w, cols ]
> >   paste(df, suffix)
> >   return(df)
> >  }
> >
> >
> > BTW, did you mean "colnames(df) <- paste(colnames(df), suffix)" instead
> > of "paste(df, suffix)" ?
> >
> > Regards, Adai
> >
> >
> >
> > On Fri, 2006-06-16 at 10:23 +0100, David Hugh-Jones wrote:
> > > I get tired of writing, e.g.
> > >
> > >
> > > data.frame[some.condition & another.condition, big.list.of.columns] <-
> > > paste(data.frame[some.condition & another.condition,
> > > big.list.of.columns], "foobar")
> > >
> > >
> > > I would a function like:
> > >
> > > inplace(paste(data.frame[some.condition & another.condition,
> > > big.list.of.columns], "foobar"))
> > >
> > > which would take the first argument of the inner function and assign
> > > the function's result to it.
> > >
> > > Has anyone done something like this? Are there simple alternative
> > > solutions that I'm missing?
> > >
> > > Cheers
> > > David
> > >
> > > ______________________________________________
> > > R-help at stat.math.ethz.ch mailing list
> > > https://stat.ethz.ch/mailman/listinfo/r-help
> > > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
> > >
> >
> >
>



More information about the R-help mailing list