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

Ivan Krylov kry|ov@r00t @end|ng |rom gm@||@com
Tue Oct 29 17:22:47 CET 2019


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



More information about the R-help mailing list