>>>>> Marc Schwartz via R-help >>>>> on Fri, 7 Jun 2019 09:07:21 -0400 writes:
> Hi, Ok, some additional tweaks. > Relative to Bert's pointing out the aesthetic issues, > certainly, those are attributes that can be adjusted as > Nick may require. I was focused more on the primary > issue. Using "..." is an easy way to pass additional > parameters to plot.default() as Bert indicated. > To Duncan's point, here is a modification of my original > function to allow for the passing of an expression, rather > than pre-creating a function and passing that: > plotFx <- function(x, expr, ...) { > expr <- substitute(expr) > y <- eval(expr) > plot(x, y, main = paste0("Plot of y = ", deparse(expr)), ...) > } > plotFx(1:10, x^2) > plotFx(1:10, cos(x)) > plotFx(1:10, exp(x) + 1) well yes.... Ross/Robert/?? had invented the curve() function to do something like that even before R got a version number !! and we (it may have been me) had added a plot.function() method for plot() which behaved very similarly, also long before R version 1.0.x Are you sure you don't want to use one of plot(<function>, ...) or curve(..) instead of what you are doing now? Look at the result of example(plot.function) and example(curve) to get a bit of a show-off of these .. > There are likely additional tweaks that could be made, as Nick may require. > Regards, > Marc ... tweaks which may already be available in curve() / plot.function(). At the time, I had invested many many man hours to tweak them to become as versatile as seemed feasible ... Martin Maechler ETH Zurich and R Core >> On Jun 6, 2019, at 5:53 PM, Duncan Murdoch <murdoch.dun...@gmail.com> wrote: >> >> These look like very fragile suggestions. Allow x^2 to be an argument (named expr, for example) to plotFx, don't force a user to write a function in a very particular way. Then use deparse(substitute(expr)) in the title. >> >> Duncan Murdoch >> >> On 06/06/2019 4:33 p.m., Bert Gunter wrote: >>> Well, if you want to do it this way, note that as written, the y axis >>> default label isn't "nice," and you should anyway allow for additional >>> graphical arguments (either way). Also, slightly better I think is to use >>> the built-in access function, body(): >>> plotFx <- function(x, fun, ...) { >>> plot(x, fun(x), main = paste0("Plot of y = ", deparse(body(fun))), ...) >>> } >>> x <- 1:10 >>> f <- function(x) x^2 >>> plotFx(x, f, col = "red", ylab = "y") >>> 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 Thu, Jun 6, 2019 at 12:19 PM Marc Schwartz <marc_schwa...@me.com> wrote: >>>> Hi, >>>> >>>> Sorry for the misfire on the first attempt. >>>> >>>> After seeing the clarifications, I thought about a possible way to do >>>> this, perhaps a little more simply, while encapsulating the plotting in a >>>> function: >>>> >>>> plotFx <- function(x, fun) { >>>> plot(x, fun(x), main = paste0("Plot of y = ", deparse(fun)[2])) >>>> } >>>> >>>> So let's say that you have: >>>> >>>> x <- 1:10 >>>> >>>> f <- function(x) x^2 >>>> plotFx(x, f) >>>> >>>> f <- function(x) cos(x) >>>> plotFx(x, f) >>>> >>>> f <- function(x) exp(x) + 1 >>>> plotFx(x, f) >>>> >>>> >>>> In the case of the first function, you get: >>>> >>>>> deparse(f) >>>> [1] "function (x) " "x^2" >>>> >>>> for the second: >>>> >>>>> deparse(f) >>>> [1] "function (x) " "cos(x)" >>>> >>>> and for the third: >>>> >>>>> deparse(f) >>>> [1] "function (x) " "exp(x) + 1" >>>> >>>> >>>> Thus, the "deparse(fun)[2]" snippet within the internal paste0() function >>>> call, gets you the second, textual part of the function body, which can >>>> then be passed as a character vector to the titles or other labels as >>>> needed. >>>> >>>> A potential gotcha that I would envision, is that the default width in the >>>> character vector resulting from deparse() is 60. Thus, by default the >>>> function body would broken up into multiple character segments, no longer >>>> than approximately 60 characters each. Thus, if you envision that you might >>>> end up with very long formulae on x, you may need to adjust the >>>> width.cutoff argument in the deparse() call, and likely need to do some >>>> additional formatting of the labels in the plot as apropos. >>>> >>>> There may be other functional nuances that I am missing here, but this may >>>> be a suitable approach. >>>> >>>> Regards, >>>> >>>> Marc >>>> >>>> >>>>> On Jun 6, 2019, at 2:11 PM, Bert Gunter <bgunter.4...@gmail.com> wrote: >>>>> >>>>> Yes, plot(z,y,..) >>>>> >>>>> Bert >>>>> >>>>> On Thu, Jun 6, 2019 at 9:21 AM Nick Wray <nicholas.w...@ntlworld.com> >>>> wrote: >>>>> >>>>> Thanks Bert, that is exactly what I wanted. I think that you meant >>>>> plot(z,y... in the last line? >>>>> >>>>> Nick >>>>> >>>>> On 06 June 2019 at 17:13 Bert Gunter <bgunter.4...@gmail.com> wrote: >>>>> >>>>> ... and if you wanted too streamline the process, something like the >>>>> following could be encapsulated in a function: >>>>> >>>>> fun <- quote(exp(x)) >>>>> z <- 1:9 >>>>> y <- eval(fun,list(x = z) ) >>>>> plot(x, y, main = paste("Plot of y =", deparse(fun))) >>>>> >>>>> Further details can be found in the "Computing on the Language" section >>>> of >>>>> the "R Language Reference" manual or from suitable tutorials on the web. >>>>> >>>>> 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 Thu, Jun 6, 2019 at 8:55 AM Nick Wray via R-help < >>>> r-help@r-project.org> >>>>> wrote: >>>>> >>>>> Thanks but that's not quite what I meant >>>>> I am trying out different functions and they don't necessarily vary in a >>>>> regular way (like say all being powers of x where it'd be simple to just >>>>> have a vector for the powers you want) >>>>> So I might have >>>>> y<-x^2 >>>>> y<-cos(x) >>>>> y<-exp(x+1) >>>>> What I am after is a way of running these functions and then calling >>>> each >>>>> one into the labelling for the appropriate graph as I plot it. So then >>>> I >>>>> would have something like >>>>> mainlab<-paste("Plot of ",function in question) >>>>> ...? Thanks Nick >>>>> >>>>>>> On 06 June 2019 at 16:40 Marc Schwartz < marc_schwa...@me.com> wrote: >>>>>>> >>>>>>> >>>>>>> >>>>>>>> On Jun 6, 2019, at 11:19 AM, Nick Wray via R-help < >>>>> r-help@r-project.org> wrote: >>>>>>>> >>>>>>>> Is there any way of taking a line of r code (eg y<-x^2) and pasting >>>>> that line of code, as is, into a label, so that for example I could then >>>>> have a plot label "Plot of y<-x^2"? >>>>>>>> >>>>>>>> Thanks Nick Wray >>>>>>> >>>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> See ?plotmath >>>>>>> >>>>>>> An example: >>>>>>> >>>>>>> x <- 1:10 >>>>>>> y <- x^2 >>>>>>> >>>>>>> plot(x, y, main = expression(paste("Plot of ", y %<-% x^2))) >>>>>>> >>>>>>> >>>>>>> There are other incantations and examples on the help page above. >>>>>>> >>>>>>> Regards, >>>>>>> >>>>>>> Marc Schwartz >>>>>>> > ______________________________________________ > R-help@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. ______________________________________________ R-help@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.