[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