[R] Replacement in an expression - can't use parse()

Daniel Berg daniel at danielberg.no
Thu Mar 29 08:39:02 CEST 2007


Thank you Gabor, your solution works great, even for veeery long expressions.

//Daniel

On 3/28/07, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
> The solution in my post has the advantage of not using
> eval or character conversions (except in setting up
> L where you want such character conversions to
> build up the names, as your more general sitution
> shows).  The following is the same as in that post except
> the line setting L in that post is replaced with the 2 lines
> setting i, j and L.  Setting L in this way would also work
> in conjunction with some of the other solutions too:
>
> e <- expression(u1 + u2 + u3)
> i <- 1; j <- 2; L <- list()
> L[[paste("u", i, sep = "")]] <- as.name(paste("u", j, sep = ""))
> as.expression(do.call(substitute, list(as.call(e), L))[[1]])
>
> One can streamline it further by making it a function and
> using assign:
>
> subu <- function(e, i, j) {
>         assign(paste("u", i, sep = ""), as.name(paste("u", j, sep = "")))
>         as.expression(do.call(substitute, list(as.call(e)))[[1]])
> }
>
> e <- expression(u1 + u2 + u3)
> subu(e, 1, 2)
>
> On 3/28/07, Daniel Berg <daniel at danielberg.no> wrote:
> > Thank you very much for your good suggestions.
> > I have chosen to pursue the suggestion by Peter which worked like a dream :)
> > However, my problem is slightly more complicated still. I apologize
> > for not mentioning this in the initial question.
> >
> > I have to do the evaluation inside a loop, not knowing explicitly
> > which 'u' to replace. This is given by the loop I'm in, say something
> > like:
> >
> > i <- 2; j <- 3
> > eval(substitute(substitute(call,list(paste("u",i,sep="")=quote(x),paste("u",j,sep="")=1)),list(call=e[[1]])))
> >
> > But this returns a syntax error.
> > Any further suggestions?
> >
> > Regards,
> > Daniel
> >
> > On 3/27/07, Thomas Lumley <tlumley at u.washington.edu> wrote:
> > > On Tue, 27 Mar 2007, Peter Dalgaard wrote:
> > >
> > > >The way around this is to add a further layer of substitute() to insert
> > > >the value of e:
> > >
> > > >> eval(substitute(substitute(call,list(u2=quote(x),u3=1)),list(call=e[[1]])))
> > > > u1 + x + 1
> > >
> > > Or eval(do.call(substitute, list(e[[1]], list(u2=quote(x),u3=1)))
> > >
> > >         -thomas
> > >
> > >
> >
> >
> > --
> > danielberg.no
> >
> > ______________________________________________
> > 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
> > and provide commented, minimal, self-contained, reproducible code.
> >
>
>


-- 
danielberg.no



More information about the R-help mailing list