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

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Wed Oct 30 01:22:17 CET 2019


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



More information about the R-help mailing list