我有一个像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"
我想从代码中的进一步操作中删除abs
和1e+06
。
答案 0 :(得分:5)
首先让我们看一下调用树:
ttt <- "abs(str1*1e6)/(str2*str3)"
library(pryr)
call_tree(parse(text=ttt))
#\- ()
# \- `/
# \- ()
# \- `abs
# \- ()
# \- `*
# \- `str1
# \- 1e+06
# \- ()
# \- `(
# \- ()
# \- `*
# \- `str2
# \- `str3
现在让我们以机器可用的格式创建它并清理一下:
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
,*
和(
。
如果表达式中有一个带有函数名的非函数对象,则此解决方案将失败。