I have not had the chance to implement this yet, but thanks to you both for your help. This r-help should be complimented on how helpful it is. Its really topnotch. Thanks
On Thu, Apr 4, 2013 at 11:11 PM, Paul Johnson <pauljoh...@gmail.com> wrote: > > > > On Thu, Apr 4, 2013 at 4:39 AM, Shane Carey <careys...@gmail.com> wrote: > >> Hi William, >> >> >> for (i in one:length(DATA_names)) >> if ((grepl("_",DATA_names[i]))=="TRUE") >> DATA_names[i]<-f(DATA_names[i])) >> >> I keep getting an error saying: incompatible types (from symbol to >> character) in subassignment type fix >> >> > I would urge you not to obliterate DATA_names by writing on top of itself. > That creates bugs that are really tough to solve. > > Remember that a character variable is not the same thing as an expression. > I mean, an expression is generally a list structure, not interchangeable > with a character string. If that f() function is creating expressions, and > you are trying to obliterate a character vector with expressions, you will > get errors, as you have seen. > > I'm pretty sure that to catch the results of a function that creates > expressions, your receiver object has to be a list. My first try would be > > myList <- vector("list", length(DATA_names)) > > > for (i in one:length(DATA_names)) > if ((grepl("_", DATA_names[i])) == "TRUE") > myList[[i]] <- f(DATA_names[i])) > > I copied your code to my system and found I couldn't run it because you > had one more paren than was needed and the word "one" was undefined. But > after fixing that, here's evidence my way works: > > Note I inserted some spaces in your code, since it is inhumane to smash > together all those letters around a poor little <- :). > > > > DATA_names<-c("A_mgkg","B_mgkg","C_mgkg","D_mgkg","E_mgkg","F_mgkg","G_mgkg","H > mgkg") > > f <- function (name) > { > # add other suffices and their corresponding plotmath expressions to the > list > env <- list2env(list(mgkg = bquote(mg ~ kg^{-1}), > ugkg = bquote(mu * g ~ kg^{-1})), > parent = emptyenv()) > pattern <- paste0("_(", paste(objects(env), collapse="|"), ")") > bquoteExpr <- parse(text=gsub(pattern, > "~(.(\\1))", > name))[[1]] > ## I use do.call() to work around the fact that bquote's first argument is > ## not evaluated. > do.call(bquote, list(bquoteExpr, env)) > } > > myList <- vector("list", length(DATA_names)) > > for (i in 1:length(DATA_names)) > if ((grepl("_", DATA_names[i])) == "TRUE") > myList[[i]] <- f(DATA_names[i]) > > > myList > > > > myList > [[1]] > > A ~ (mg ~ kg^{ > -1 > }) > > [[2]] > > B ~ (mg ~ kg^{ > -1 > }) > > [[3]] > > C ~ (mg ~ kg^{ > -1 > }) > > [[4]] > > D ~ (mg ~ kg^{ > -1 > }) > > [[5]] > > E ~ (mg ~ kg^{ > -1 > }) > > [[6]] > > F ~ (mg ~ kg^{ > -1 > }) > > [[7]] > > G ~ (mg ~ kg^{ > -1 > }) > > [[8]] > NULL > > > I asked a very similar question here last year and got many interesting > suggestions. I was so fascinated I wrote a little programming vignette > called Rchaeology in my package "rockchalk". As soon as you settle on the > most direct route from start to end, please post, I might learn new tricks. > > In your case, I've been wondering if you ought to edit the string before > it becomes an expression, or whether you should edit the expression after. > I needed a correct expression to start, though. This writes the correct > thing in the middle of the graph. Correct? > > xcorrect <- expression(X ~~ "mg kg"^{-1}) > plot(1:10, 1:10, type ="n") > text(5, 5, xcorrect) > > Supposing that's correct, watch this. > > mgkg <- quote("mg kg"^{-1}) > > text(4, 2, bquote(A ~~ .(mgkg))) > text(4, 3, bquote(B ~~ .(mgkg))) > text(4, 6, bquote(C ~~ .(mgkg))) > > I've got the "units" captured in mgkg, and then when I want to draw that > into > and expression, i used bquote. substitute works as well, maybe more clear. > > text(3, 8, substitute(B ~~ myUnit, list(myUnit = mgkg))) > > In any case, I thought this was a fun question. > > pj > > > >> Have you any ideas on how to get around this, thanks again for your help, >> much appreciated. >> Cheers >> >> >> On Wed, Apr 3, 2013 at 5:33 PM, William Dunlap <wdun...@tibco.com> wrote: >> >> > Are you trying to convert a column name like "Na_mgkg" to a plot label >> > like Na (mg kg^-1) ? >> > If so you will have to use both string manipulation functions like >> gsub() >> > and expression manipulating >> > functions like bquote(). E.g., >> > >> > f <- function (name) >> > { >> > # add other suffices and their corresponding plotmath expressions to >> > the list >> > env <- list2env(list(mgkg = bquote(mg ~ kg^{-1}), >> > ugkg = bquote(mu * g ~ kg^{-1})), >> > parent = emptyenv()) >> > pattern <- paste0("_(", paste(objects(env), collapse="|"), ")") >> > bquoteExpr <- parse(text=gsub(pattern, >> > "~(.(\\1))", >> > name))[[1]] >> > # I use do.call() to work around the fact that bquote's first >> argument >> > is not evaluated. >> > do.call(bquote, list(bquoteExpr, env)) >> > } >> > >> > d <- data.frame("Na_mgkg"=1:10, "K_ugkg"=10:1) >> > plot(Na_mgkg ~ K_ugkg, data=d, xlab=f("K_ugkg"), ylab=f("Na_mgkg")) >> > >> > Bill Dunlap >> > Spotfire, TIBCO Software >> > wdunlap tibco.com >> > >> > >> > > -----Original Message----- >> > > From: r-help-boun...@r-project.org [mailto: >> r-help-boun...@r-project.org] >> > On Behalf >> > > Of Shane Carey >> > > Sent: Wednesday, April 03, 2013 8:02 AM >> > > To: r-help@r-project.org >> > > Subject: [R] Superscript >> > > >> > > Hi, >> > > How do I write a superscript within gsub? >> > > >> > > I have the following: gsub("_mgkg",expression(paste("mg >> > kg"^{-1})),names[1]) >> > > >> > > Thanks >> > > >> > > >> > > >> > > -- >> > > Shane >> > > >> > > [[alternative HTML version deleted]] >> > > >> > > ______________________________________________ >> > > R-help@r-project.org 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. >> > >> >> >> >> -- >> Shane >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help@r-project.org 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. >> > > > > -- > Paul E. Johnson > Professor, Political Science Assoc. Director > 1541 Lilac Lane, Room 504 Center for Research Methods > University of Kansas University of Kansas > http://pj.freefaculty.org http://quant.ku.edu > -- Shane [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org 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.