[R] Pasting R code lines into labels
Martin Maechler
m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Fri Jun 7 15:25:13 CEST 2019
>>>>> 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.duncan using 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_schwartz using 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.4567 using gmail.com> wrote:
>>>>>
>>>>> Yes, plot(z,y,..)
>>>>>
>>>>> Bert
>>>>>
>>>>> On Thu, Jun 6, 2019 at 9:21 AM Nick Wray <nicholas.wray using 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.4567 using 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 using 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_schwartz using me.com> wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> On Jun 6, 2019, at 11:19 AM, Nick Wray via R-help <
>>>>> r-help using 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 using 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.
More information about the R-help
mailing list