[R] Pasting R code lines into labels

Marc Schwartz m@rc_@chw@rtz @end|ng |rom me@com
Fri Jun 7 15:07:21 CEST 2019


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)


There are likely additional tweaks that could be made, as Nick may require.

Regards,

Marc

> 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
>>>>>> 



More information about the R-help mailing list