是否有一个R函数可以将数学字符串转换为内容mathml?

bmp9r5qi  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(102)

我试图找到一种方法来将包含数学表达式的字符串转换为内容mathml(https://en.wikipedia.org/wiki/MathML#Content_MathML)。例如,我有一个示例字符串“Vmax*S/(Km+S)”,我需要将其转换为

<apply>
 <divide/>
 <apply>
   <times/>
   <ci> Vmax </ci>
   <ci> S </ci>
 </apply>
 <apply>
   <plus/>
   <ci> Km </ci>
   <ci> S </ci>
 </apply>
</apply>

我发现我可以像这样使用那个mathml包

library(mathml)

y = quote(Vmax*S/(Km+S))
mathml(term=y)

创建演示样式mathml(https://en.wikipedia.org/wiki/MathML#Presentation_MathML):

<math>
  <mrow>
    <mrow>
      <mi>Vmax</mi>
      <mo>&#x2062;</mo>
      <mi>S</mi>
    </mrow>
    <mo>/</mo>
    <mrow>
      <mo>(</mo>
      <mrow>
        <mi>Km</mi>
        <mo>+</mo>
        <mi>S</mi>
      </mrow>
      <mo>)</mo>
    </mrow>
  </mrow>
</math>

不幸的是,我需要内容版本。如果在表示和内容mathml之间有一个函数转换器,那也可以解决我的问题。

6jjcrrmo

6jjcrrmo1#

此递归函数具有足够的功能来处理测试表达式。

toml <- function(e) {
  if (is.symbol(e)) c("<ci>", as.character(e), "</ci>")
  else if (identical(e[[1]], as.symbol("+")))
    c("<apply>", "<plus/>", Recall(e[[2]]), Recall(e[[3]]), "</apply>")
  else if (identical(e[[1]], as.symbol("-")))
    c("<apply>", "<minus/>", Recall(e[[2]]), Recall(e[[3]]), "</apply>")
  else if (identical(e[[1]], as.symbol("*")))  
    c("<apply>", "<times/>", Recall(e[[2]]), Recall(e[[3]]), "</apply>")
  else if (identical(e[[1]], as.symbol("/")))  
    c("<apply>", "<divide/>", Recall(e[[2]]), Recall(e[[3]]), "</apply>")
  else if (identical(e[[1]], as.symbol("("))) Recall(e[[2]])
}

# test
y <- quote(Vmax*S/(Km+S))
toml(y)
##  [1] "<apply>"   "<divide/>" "<apply>"   "<times/>"  "<ci>"      "Vmax"     
##  [7] "</ci>"     "<ci>"      "S"         "</ci>"     "</apply>"  "<apply>"  
## [13] "<plus/>"   "<ci>"      "Km"        "</ci>"     "<ci>"      "S"        
## [19] "</ci>"     "</apply>"  "</apply>"

相关问题