【问题标题】:Check a given string is a math function or not in R [closed]检查给定的字符串是否是R中的数学函数[关闭]
【发布时间】:2016-06-27 15:16:41
【问题描述】:

我有这样的表达式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

【问题讨论】:

  • 在您的情况下,不是每个字符串后跟( 都是“数学函数”。请添加您的代码和示例;你的问题很模糊
  • 能否提供 strsplit 操作的输出?我可以帮助您构建一个正则表达式,但我对 R 不太熟悉。如果您提供“数学函数”列表(可能是文档链接)以及此 strsplit 操作的结果,将会很有帮助在abs(str1*1e6)/(str2*str3)
  • 我已经编辑了这个问题。请检查
  • 在您的示例表达式中调用了 4 个函数。我在您的strsplit 输出中只看到其中一个。您应该解析表达式并分析调用树。
  • 发布答案后,最好只更改示例以保持答案有效...

标签: regex r math


【解决方案1】:

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

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*(

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

【讨论】:

  • 这个解决方案有帮助。
猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 2013-07-26
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
相关资源
最近更新 更多