[R] Calling the curve function with a character object converted into an expression
Sebastien Bihorel
@eb@@t|en@b|hore| @end|ng |rom cogn|gencorp@com
Thu May 3 15:00:54 CEST 2018
Thanks,
I always get confused by expression evaluation, when and how to use call, do.call, eval, parse/deparse, and all that good stuff. I always have to read documentation 10 times and still does not want to stick in my brain.
----- Original Message -----
From: "Bert Gunter" <bgunter.4567 using gmail.com>
To: "Sebastien Bihorel" <sebastien.bihorel using cognigencorp.com>
Cc: "R-help" <r-help using r-project.org>
Sent: Thursday, May 3, 2018 2:28:59 AM
Subject: Re: [R] Calling the curve function with a character object converted into an expression
Typo: should be NULL not NUL of course
An alternative approach closer to your original attempt is to use
do.call() to explicitly evaluate the expr argument:
w <- "1 + x^2"
do.call(curve, list(expr = parse(text = w), ylab ="y"))
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 Wed, May 2, 2018 at 10:35 PM, Bert Gunter <bgunter.4567 using gmail.com> wrote:
> Sebastian:
>
> This is somewhat arcane, perhaps even a bug (correction on this
> welcomed). The problem is that the "expr" argument to curve() must be
> an actual expression, not a call to parse that evaluates to an
> expression. If you look at the code of curve() you'll see why
> (substitute() does not evaluate expr in the code). Another simple
> workaround other than sticking in the eval() call is this:
>
> myf <- function(x)NUL
> body(myf)<- parse(text = "{1+x^2}") ## note the additional "{ }"
> for safety, though not necessary here
> ## this idiom will continue to work for any text.
>
> curve(myf, from = 0, to = 10) ## myf is now the name of a function
> that executes the parsed text.
>
> *** I would appreciate any wiser R programmers correcting any
> misunderstanding or error in my explanation ***
>
> 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 Wed, May 2, 2018 at 8:11 PM, Sebastien Bihorel
> <sebastien.bihorel using cognigencorp.com> wrote:
>>
>> Hi,
>>
>> Down a cascade of function calls, I want to use the curve function with an expression that is a variable. For various reason, this variable must be a character object and cannot be an expression as required by the curve function. How do I convert my variable into a expression that is accepted by curve?
>>
>> Thanks in advance for your help.
>>
>> ## The following attempts do not work
>>
>> myf <- '1+x^2'
>> curve(myf, from = 0, to = 10) # obviously !
>> curve(parse(text=myf), from = 0, to = 10) # not sure why this does not work
>>
>> ## This works but does not feel elegant:
>> eval(parse(text=sprintf('curve(%s, from = 0, to = 10)', myf)))
>>
>> ______________________________________________
>> 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