[R] decomposing a string representing a valid mathematical expression?

Bert Gunter bgunter@4567 @end|ng |rom gm@||@com
Wed Oct 30 02:35:11 CET 2019


Yes, I agree. Maybe the clumsiness of my example might help clarify the
importance of clarifying the context/understanding the difficulty.

Cheers,
Bert


On Tue, Oct 29, 2019 at 5:22 PM Duncan Murdoch <murdoch.duncan using gmail.com>
wrote:

> On 29/10/2019 12:46 p.m., Bert Gunter wrote:
> > Does something like the following make any sense for your context?
> >
> >> z <- "(xy+ s)/ (ab +log(4.13))"
> >>
> >> lapply(parse(text = z), FUN = function(x)strsplit(deparse(x), split =
> > "[[:space:]]+"))
> > [[1]]
> > [[1]][[1]]
> > [1] "(xy"        "+"          "s)/(ab"     "+"          "log(4.13))"
>
> That's the wrong way to do it.  Notice the 3rd element,  "s)/(ab", which
> combines two partial operands and an operator.  Deparsing doesn't always
> introduce spaces, as your reprex assumes.
>
> I think Witold's request is quite hard to do.  The right way to handle
> expressions is as hierachical objects, like those returned from
> parse(text = z).  Turning those into character vectors of lexical tokens
> doesn't make sense.
>
> Perhaps if Witold explained the context of what he is trying to do
> someone could give a suggestion about a better approach.
>
> Duncan Murdoch
>
> >
> >
> > 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 Tue, Oct 29, 2019 at 9:23 AM Ivan Krylov <krylov.r00t using gmail.com>
> wrote:
> >
> >> On Tue, 29 Oct 2019 13:55:27 +0100
> >> Witold E Wolski <wewolski using gmail.com> wrote:
> >>
> >>> Since R knows how to parse expressions these type of expressions I
> >>> would like to reuse some existing functions and not to use gsub or
> >>> strsplit etc.
> >>
> >> You might be interested in the `parse` function:
> >>
> >> x <- "(a+b) * c/(d * (e - f))"
> >> str(parse(text = x))
> >> # length 1 expression((a + b) * c/(d * (e - f)))
> >> #  - attr(*, "srcref")=List of 1
> >> #   ..$ : 'srcref' int [1:8] 1 1 1 23 1 23 1 1
> >> #   .. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile'
> >> <environment: 0x55ebecdac210>
> >> #  - attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile'
> >> <environment:0x55ebecdac210>
> >> #  - attr(*, "wholeSrcref")= 'srcref' int [1:8] 1 0 2 0 0 0 1 2
> >> #   ..- attr(*, "srcfile")=Classes 'srcfilecopy',
> >> 'srcfile'<environment:0x55ebecdac210>
> >> parse(text = x)[[1]]
> >> # (a + b) * c/(d * (e - f))
> >> parse(text = x)[[1]][1]
> >> # `/`()
> >> parse(text = x)[[1]][2]
> >> # ((a + b) * c)()
> >> parse(text = x)[[1]][3]
> >> # (d * (e - f))()
> >>
> >> Quoting ?expression,
> >>
> >>>> As an object of mode ‘"expression"’ is a list, it can be subsetted
> >>>> by ‘[’, ‘[[’ or ‘$’, the latter two extracting individual calls etc.
> >>
> >> --
> >> Best regards,
> >> Ivan
> >>
> >> ______________________________________________
> >> 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.
> >>
> >
> >       [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > 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.
> >
>
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list