在R中检查给定的字符串是否为数学函数

时间:2016-06-27 15:16:41

标签: regex r math

我有一个像abs(iodlin_vod2*1e6)/(array*nfin*nrx*nfinger*weff)这样的表达式。我的代码使用strsplit拆分此表达式。现在,根据这个结果,我应该检查每个单词是否是数学函数,如果不是,我应该执行一些操作。 如果它是数学函数,我会坚持检查这个词。有人可以帮忙。

Qsn编辑: 这是strsplit

的结果
sstemp
[1] "abs"          "iodlin_vod2 " " 1e+06"       "array "       " nfin "       
" nrx "       
[7] " nfinger "    " weff" 

我想从代码中的进一步操作中删除abs1e+06

1 个答案:

答案 0 :(得分:5)

首先让我们看一下调用树:

ttt <- "abs(str1*1e6)/(str2*str3)"
library(pryr)
call_tree(parse(text=ttt))
#\- ()
#  \- `/
#  \- ()
#    \- `abs
#    \- ()
#      \- `*
#      \- `str1
#      \-  1e+06
#  \- ()
#    \- `(
#    \- ()
#      \- `*
#      \- `str2
#      \- `str3

另见Hadley's book

现在让我们以机器可用的格式创建它并清理一下:

test <- gsub("\\\\\\-|\\s*|`", "",
          unlist(
            strsplit(
              vapply(parse(text = ttt), pryr:::tree, 
                     character(1), width = getOption("width")), 
            "\\n")
          )
        )
#[1] "()"    "/"     "()"    "abs"   "()"    "*"     "str1"  "1e+06" "()"    "("     "()"    "*"     "str2"  "str3"

然后我们可以测试:

vapply(test, function(x) is.function(tryCatch(getFunction(x), error = function(cond) NA)), logical(1))
#   ()     /    ()   abs    ()     *  str1 1e+06    ()     (    ()     *  str2  str3 
#FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE 

如您所见,此表达式中有四种不同的功能:/abs*(

如果表达式中有一个带有函数名的非函数对象,则此解决方案将失败。