Thank you Gabor, your solution works great, even for veeery long expressions.
//Daniel On 3/28/07, Gabor Grothendieck <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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@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 ______________________________________________ R-help@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.