Thanks Bert! It certainly works for the example (and shows a much deeper understanding of eval, substitute, etc. than I have). But it doesn't appear to generalize very well in the way I need (which of course I didn't think of mentioning until after I sent the email -- sorry). Suppose subs is any expression that would be valid for the subset argument of base::subset, for a given data frame. Then I can extract that subset of the data frame by using mydf[ with(mydf, eval(subs)) , ] (or similar). Then, having plotted some aspect of that subset, I want to annotate the plot with the subset specifications. I've used this approach to set up a system that helps me to interactively review various subsets of a large set of data. I save the final selected subsetting expressions in some sort of data structure, for later use in preparing a report using rmarkdown. I was hoping to use plotmath to improve the appearance of the annotations -- but I now think it's not worth this kind of effort. I think I'm going to settle for mtext( as.character(subs) ). -Don -- Don MacQueen Lawrence Livermore National Laboratory 7000 East Ave., L-627 Livermore, CA 94550 925-423-1062 Lab cell 925-724-7509 From: Bert Gunter <bgunter.4567 at gmail.com> Date: Monday, August 20, 2018 at 3:38 PM To: "MacQueen, Don" <macqueen1 at llnl.gov> Cc: array R-help <r-help at r-project.org> Subject: Re: [R] plotmath and logical operators? This is clumsy and probably subject to considerable improvement, but does it work for you: left <- quote(x >= 3) right <- quote(y <= 3) ## these can be anything ## the plot: plot(1) eval(substitute(mtext(expression(paste(left, " & ",right))), list(left = left, right = right))) ## Expression evaluation eval(substitute(with(df,left & right), list(left = left, right = right))) Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Mon, Aug 20, 2018 at 2:00 PM MacQueen, Don via R-help <r-help at r-project.org<mailto:r-help at r-project.org>> wrote: I would like to use plotmath to annotate a plot with an expression that includes a logical operator. ## works well tmp <- expression(x >= 3) plot(1) mtext(tmp) ## not so well tmp <- expression(x >= 3 & y <= 3) plot(1) mtext(tmp) Although the text that's displayed makes sense, it won't be obvious to my non-mathematical audience. I'd appreciate suggestions. I've found a work-around that gets the annotation to look right tmpw <- expression(paste( x >= 3, " & ", y <= 3) ) plot(1) mtext(tmpw) But it breaks my original purpose, illustrated by this example: df <- data.frame(x=1:5, y=1:5) tmp <- expression(x >= 3 & y <= 3) tmpw <- expression(paste( x >= 3, " & ", y <= 3) ) with(df, eval(tmp)) [1] FALSE FALSE TRUE FALSE FALSE with(df, eval(tmpw)) [1] "FALSE & TRUE" "FALSE & TRUE" "TRUE & TRUE" "TRUE & FALSE" "TRUE & FALSE" Thanks -Don -- Don MacQueen Lawrence Livermore National Laboratory 7000 East Ave., L-627 Livermore, CA 94550 925-423-1062 Lab cell 925-724-7509 ______________________________________________ R-help at r-project.org<mailto:R-help at r-project.org> mailing list -- To UNSUBSCRIBE and more, see 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. [[alternative HTML version deleted]]
As I understand it, the problem is: "A mathematical expression must obey the normal rules of syntax for any *R* expression, but it is interpreted according to very different rules than for normal *R* expressions." I believe this means that you cannot do what you wanted to using plotmath. Cheers, Bert On Mon, Aug 20, 2018 at 4:14 PM MacQueen, Don <macqueen1 at llnl.gov> wrote:> Thanks Bert! > > > > It certainly works for the example (and shows a much deeper understanding > of eval, substitute, etc. than I have). But it doesn't appear to generalize > very well in the way I need (which of course I didn't think of mentioning > until after I sent the email -- sorry). > > > > Suppose subs is any expression that would be valid for the subset argument > of base::subset, for a given data frame. Then I can extract that subset of > the data frame by using > > mydf[ with(mydf, eval(subs)) , ] > > (or similar). > > > > Then, having plotted some aspect of that subset, I want to annotate the > plot with the subset specifications. > > > > I've used this approach to set up a system that helps me to interactively > review various subsets of a large set of data. I save the final selected > subsetting expressions in some sort of data structure, for later use in > preparing a report using rmarkdown. > > > > I was hoping to use plotmath to improve the appearance of the annotations > -- but I now think it's not worth this kind of effort. I think I'm going to > settle for mtext( as.character(subs) ). > > > > -Don > > > > -- > > Don MacQueen > > Lawrence Livermore National Laboratory > > 7000 East Ave., L-627 > > Livermore, CA 94550 > > 925-423-1062 > > Lab cell 925-724-7509 > > > > > > > > *From: *Bert Gunter <bgunter.4567 at gmail.com> > *Date: *Monday, August 20, 2018 at 3:38 PM > *To: *"MacQueen, Don" <macqueen1 at llnl.gov> > *Cc: *array R-help <r-help at r-project.org> > *Subject: *Re: [R] plotmath and logical operators? > > > > This is clumsy and probably subject to considerable improvement, but does > it work for you: > > > > left <- quote(x >= 3) > right <- quote(y <= 3) ## these can be anything > > > > ## the plot: > > plot(1) > > eval(substitute(mtext(expression(paste(left, " & ",right))), list(left > left, right = right))) > > > > ## Expression evaluation > > eval(substitute(with(df,left & right), list(left = left, right = right))) > > Cheers, > > Bert > > > > > Bert Gunter > > "The trouble with having an open mind is that people keep coming along and > sticking things into it." > -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) > > > > > > On Mon, Aug 20, 2018 at 2:00 PM MacQueen, Don via R-help < > r-help at r-project.org> wrote: > > I would like to use plotmath to annotate a plot with an expression that > includes a logical operator. > > ## works well > tmp <- expression(x >= 3) > plot(1) > mtext(tmp) > > ## not so well > tmp <- expression(x >= 3 & y <= 3) > plot(1) > mtext(tmp) > > Although the text that's displayed makes sense, it won't be obvious to my > non-mathematical audience. > > I'd appreciate suggestions. > > > I've found a work-around that gets the annotation to look right > tmpw <- expression(paste( x >= 3, " & ", y <= 3) ) > plot(1) > mtext(tmpw) > > > But it breaks my original purpose, illustrated by this example: > > df <- data.frame(x=1:5, y=1:5) > tmp <- expression(x >= 3 & y <= 3) > tmpw <- expression(paste( x >= 3, " & ", y <= 3) ) > with(df, eval(tmp)) > [1] FALSE FALSE TRUE FALSE FALSE > with(df, eval(tmpw)) > [1] "FALSE & TRUE" "FALSE & TRUE" "TRUE & TRUE" "TRUE & FALSE" > "TRUE & FALSE" > > Thanks > -Don > > -- > Don MacQueen > Lawrence Livermore National Laboratory > 7000 East Ave., L-627 > Livermore, CA 94550 > 925-423-1062 > Lab cell 925-724-7509 > > > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. > >[[alternative HTML version deleted]]
A generalization of Bert's suggestion is plotSubset <- function (data, subset, qsubset = substitute(subset)) { sdata <- data[eval(qsubset, data), ] with(sdata, plot(x, y, main = subsetToPlotmath(expr = qsubset))) } subsetToPlotmath <- function(expr) { # Argument 'expr': an expression used as subset argument to subset() # Return: an expression used by plotmath that is more readable to non-programming people if (is.call(expr)) { for(i in seq_along(expr)) { expr[[i]] <- subsetToPlotmath(expr[[i]]) } if (is.name(funcName <- expr[[1]]) && !is.null(func <- env.subsetToPlotmath[[as.character(funcName)]])) { expr <- do.call(func, as.list(expr[-1])) } } expr } env.subsetToPlotmath <- new.env() env.subsetToPlotmath[["&"]] <- function(x, y) substitute(x ~ italic(and) ~ y) env.subsetToPlotmath[["|"]] <- function(x, y) substitute((x) ~ italic(or) ~ (y)) # internal parens not always needed env.subsetToPlotmath[["log10"]] <- function(x) substitute(italic(log)[10](x)) env.subsetToPlotmath[["exp"]] <- function(x) substitute(italic(e)^x) You can add more conversions to the environment env.subsetToPlotmath. Try it with> df <- data.frame(x=1:5, y=1:5) > plotSubset(df, x<1.5 | y>3.5) # see title "(x < 1.5) or (y > 3.5)" andpts at x=1,4,5. It doesn't get right the parentheses needed to enforce the order of evaluation: it always puts parentheses around the arguments to | and never puts them around the arguments to &. Bill Dunlap TIBCO Software wdunlap tibco.com On Mon, Aug 20, 2018 at 4:14 PM, MacQueen, Don via R-help < r-help at r-project.org> wrote:> Thanks Bert! > > It certainly works for the example (and shows a much deeper understanding > of eval, substitute, etc. than I have). But it doesn't appear to generalize > very well in the way I need (which of course I didn't think of mentioning > until after I sent the email -- sorry). > > Suppose subs is any expression that would be valid for the subset argument > of base::subset, for a given data frame. Then I can extract that subset of > the data frame by using > mydf[ with(mydf, eval(subs)) , ] > (or similar). > > Then, having plotted some aspect of that subset, I want to annotate the > plot with the subset specifications. > > I've used this approach to set up a system that helps me to interactively > review various subsets of a large set of data. I save the final selected > subsetting expressions in some sort of data structure, for later use in > preparing a report using rmarkdown. > > I was hoping to use plotmath to improve the appearance of the annotations > -- but I now think it's not worth this kind of effort. I think I'm going to > settle for mtext( as.character(subs) ). > > -Don > > -- > Don MacQueen > Lawrence Livermore National Laboratory > 7000 East Ave., L-627 > Livermore, CA 94550 > 925-423-1062 > Lab cell 925-724-7509 > > > > From: Bert Gunter <bgunter.4567 at gmail.com> > Date: Monday, August 20, 2018 at 3:38 PM > To: "MacQueen, Don" <macqueen1 at llnl.gov> > Cc: array R-help <r-help at r-project.org> > Subject: Re: [R] plotmath and logical operators? > > This is clumsy and probably subject to considerable improvement, but does > it work for you: > > left <- quote(x >= 3) > right <- quote(y <= 3) ## these can be anything > > ## the plot: > plot(1) > eval(substitute(mtext(expression(paste(left, " & ",right))), list(left > left, right = right))) > > ## Expression evaluation > eval(substitute(with(df,left & right), list(left = left, right = right))) > Cheers, > Bert > > > Bert Gunter > > "The trouble with having an open mind is that people keep coming along and > sticking things into it." > -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) > > > On Mon, Aug 20, 2018 at 2:00 PM MacQueen, Don via R-help < > r-help at r-project.org<mailto:r-help at r-project.org>> wrote: > I would like to use plotmath to annotate a plot with an expression that > includes a logical operator. > > ## works well > tmp <- expression(x >= 3) > plot(1) > mtext(tmp) > > ## not so well > tmp <- expression(x >= 3 & y <= 3) > plot(1) > mtext(tmp) > > Although the text that's displayed makes sense, it won't be obvious to my > non-mathematical audience. > > I'd appreciate suggestions. > > > I've found a work-around that gets the annotation to look right > tmpw <- expression(paste( x >= 3, " & ", y <= 3) ) > plot(1) > mtext(tmpw) > > > But it breaks my original purpose, illustrated by this example: > > df <- data.frame(x=1:5, y=1:5) > tmp <- expression(x >= 3 & y <= 3) > tmpw <- expression(paste( x >= 3, " & ", y <= 3) ) > with(df, eval(tmp)) > [1] FALSE FALSE TRUE FALSE FALSE > with(df, eval(tmpw)) > [1] "FALSE & TRUE" "FALSE & TRUE" "TRUE & TRUE" "TRUE & FALSE" > "TRUE & FALSE" > > Thanks > -Don > > -- > Don MacQueen > Lawrence Livermore National Laboratory > 7000 East Ave., L-627 > Livermore, CA 94550 > 925-423-1062 > Lab cell 925-724-7509 > > > > ______________________________________________ > R-help at r-project.org<mailto:R-help at r-project.org> mailing list -- To > UNSUBSCRIBE and more, see > 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. > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. >[[alternative HTML version deleted]]
## I would use microplot in this situation. ## This example produces a pdf file containing the graph. library(lattice) library(microplot) ## Hmisc options for pdflatex ## graphics files are .pdf latexSetOptions() RtoLatex <- function(subset , subset.char=substitute(subset)) { ## you might need some gsub calls in here paste0("$", subset.char, "$") } plotSubsetLatex <- function (data, subset, qsubset = substitute(subset), ...) { sdata <- data[eval(qsubset, data), ] myplot <- xyplot( y ~ x , data=sdata) latex(myplot, ## caption=RtoLatex(subset.char=deparse(qsubset)), ## use either caption or colheads colheads=paste("\\Large \\strut", ## Hmisc::latex argument RtoLatex(subset.char=deparse(qsubset))), collapse=identity, ## collapse is an argument to microplot() x.axis=FALSE, y.axis=FALSE, ## x.axis, y.axis are arguments to as.includegraphics() ...) ## arguments to latex() or as.includegraphics() or microplot() } df <- data.frame(x=1:5, y=1:5) myplot.tex <- plotSubsetLatex(df, x<1.5 | y>3.5, ## see title "(x < 1.5) | (y > 3.5)" and pts at x=1,4,5. height.panel=3, width.panel=3, rowname=NULL) myplot.tex$file ## pathname to tex file which contains pathname to component pdf file ## print.default(myplot.tex) ## pathname to tex file and additional information about component pdf files myplot.tex ## displays generated pdf file on screen, and pathname to generated pdf file On Mon, Aug 20, 2018 at 10:12 PM, William Dunlap via R-help <r-help at r-project.org> wrote:> A generalization of Bert's suggestion is > > plotSubset <- function (data, subset, qsubset = substitute(subset)) > { > sdata <- data[eval(qsubset, data), ] > with(sdata, plot(x, y, main = subsetToPlotmath(expr = qsubset))) > } > > > subsetToPlotmath <- function(expr) { > # Argument 'expr': an expression used as subset argument to subset() > # Return: an expression used by plotmath that is more readable to > non-programming people > if (is.call(expr)) { > for(i in seq_along(expr)) { > expr[[i]] <- subsetToPlotmath(expr[[i]]) > } > if (is.name(funcName <- expr[[1]]) && !is.null(func <- > env.subsetToPlotmath[[as.character(funcName)]])) { > expr <- do.call(func, as.list(expr[-1])) > } > } > expr > } > env.subsetToPlotmath <- new.env() > env.subsetToPlotmath[["&"]] <- function(x, y) substitute(x ~ italic(and) ~ > y) > env.subsetToPlotmath[["|"]] <- function(x, y) substitute((x) ~ italic(or) ~ > (y)) # internal parens not always needed > env.subsetToPlotmath[["log10"]] <- function(x) > substitute(italic(log)[10](x)) > env.subsetToPlotmath[["exp"]] <- function(x) substitute(italic(e)^x) > > You can add more conversions to the environment env.subsetToPlotmath. > > Try it with > >> df <- data.frame(x=1:5, y=1:5) >> plotSubset(df, x<1.5 | y>3.5) # see title "(x < 1.5) or (y > 3.5)" and > pts at x=1,4,5. > > It doesn't get right the parentheses needed to enforce the order of > evaluation: > it always puts parentheses around the arguments to | and never puts them > around the arguments to &. > > Bill Dunlap > TIBCO Software > wdunlap tibco.com > > On Mon, Aug 20, 2018 at 4:14 PM, MacQueen, Don via R-help < > r-help at r-project.org> wrote: > >> Thanks Bert! >> >> It certainly works for the example (and shows a much deeper understanding >> of eval, substitute, etc. than I have). But it doesn't appear to generalize >> very well in the way I need (which of course I didn't think of mentioning >> until after I sent the email -- sorry). >> >> Suppose subs is any expression that would be valid for the subset argument >> of base::subset, for a given data frame. Then I can extract that subset of >> the data frame by using >> mydf[ with(mydf, eval(subs)) , ] >> (or similar). >> >> Then, having plotted some aspect of that subset, I want to annotate the >> plot with the subset specifications. >> >> I've used this approach to set up a system that helps me to interactively >> review various subsets of a large set of data. I save the final selected >> subsetting expressions in some sort of data structure, for later use in >> preparing a report using rmarkdown. >> >> I was hoping to use plotmath to improve the appearance of the annotations >> -- but I now think it's not worth this kind of effort. I think I'm going to >> settle for mtext( as.character(subs) ). >> >> -Don >> >> -- >> Don MacQueen >> Lawrence Livermore National Laboratory >> 7000 East Ave., L-627 >> Livermore, CA 94550 >> 925-423-1062 >> Lab cell 925-724-7509 >> >> >> >> From: Bert Gunter <bgunter.4567 at gmail.com> >> Date: Monday, August 20, 2018 at 3:38 PM >> To: "MacQueen, Don" <macqueen1 at llnl.gov> >> Cc: array R-help <r-help at r-project.org> >> Subject: Re: [R] plotmath and logical operators? >> >> This is clumsy and probably subject to considerable improvement, but does >> it work for you: >> >> left <- quote(x >= 3) >> right <- quote(y <= 3) ## these can be anything >> >> ## the plot: >> plot(1) >> eval(substitute(mtext(expression(paste(left, " & ",right))), list(left >> left, right = right))) >> >> ## Expression evaluation >> eval(substitute(with(df,left & right), list(left = left, right = right))) >> Cheers, >> Bert >> >> >> Bert Gunter >> >> "The trouble with having an open mind is that people keep coming along and >> sticking things into it." >> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) >> >> >> On Mon, Aug 20, 2018 at 2:00 PM MacQueen, Don via R-help < >> r-help at r-project.org<mailto:r-help at r-project.org>> wrote: >> I would like to use plotmath to annotate a plot with an expression that >> includes a logical operator. >> >> ## works well >> tmp <- expression(x >= 3) >> plot(1) >> mtext(tmp) >> >> ## not so well >> tmp <- expression(x >= 3 & y <= 3) >> plot(1) >> mtext(tmp) >> >> Although the text that's displayed makes sense, it won't be obvious to my >> non-mathematical audience. >> >> I'd appreciate suggestions. >> >> >> I've found a work-around that gets the annotation to look right >> tmpw <- expression(paste( x >= 3, " & ", y <= 3) ) >> plot(1) >> mtext(tmpw) >> >> >> But it breaks my original purpose, illustrated by this example: >> >> df <- data.frame(x=1:5, y=1:5) >> tmp <- expression(x >= 3 & y <= 3) >> tmpw <- expression(paste( x >= 3, " & ", y <= 3) ) >> with(df, eval(tmp)) >> [1] FALSE FALSE TRUE FALSE FALSE >> with(df, eval(tmpw)) >> [1] "FALSE & TRUE" "FALSE & TRUE" "TRUE & TRUE" "TRUE & FALSE" >> "TRUE & FALSE" >> >> Thanks >> -Don >> >> -- >> Don MacQueen >> Lawrence Livermore National Laboratory >> 7000 East Ave., L-627 >> Livermore, CA 94550 >> 925-423-1062 >> Lab cell 925-724-7509 >> >> >> >> ______________________________________________ >> R-help at r-project.org<mailto:R-help at r-project.org> mailing list -- To >> UNSUBSCRIBE and more, see >> 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. >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> 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. >> > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.