R - 确定字符串是否可以在不使用eval()的情况下对函数进行评估

时间:2014-07-23 13:39:52

标签: r string eval

eval()周围的R似乎有很多功能(至少比我以前更多)。有没有办法测试字符串(str)是否会评估函数?

寻找以下功能,

R> is.strFun("boo(x)")
TRUE
R> is.strFun("boo")
FALSE
R> is.strFun("boo(baz(Y))")
TRUE

我宁愿不使用eval(parse(text=str))因为我目前正在使用它而且它变得非常混乱,因为"boo(x)"可能strboo(x)内}。

我想做的事情:我想让R函数成为另一种语言的包装器。但是,而不是通常的eval2other('set x=2;set y=x*x')(这是other语言中的字符串被评估为other),我宁愿该函数具有与R类似的样式。我有大部分解析完成了,但我遇到像"boo(boo(Y))"之类的问题。我有一个解决方案,但它非常多毛,很难调试(即使使用像debug这样的软件包)。

2 个答案:

答案 0 :(得分:2)

这是另一种适用于前缀调用的方式,但不适用于中缀调用,例如%in%

is.prefix.call <- function(text) {
    d <- getParseData(parse(text=text))
    with(d, token[id == 1] == 'SYMBOL_FUNCTION_CALL')
}

is.prefix.call("boo(x)")
# TRUE
is.prefix.call("boo")
# FALSE
is.prefix.call("boo(baz(Y))")
# TRUE

答案 1 :(得分:1)

这远非完美,但它很短,也许它足够好了:

isFunCall <- function(x) grepl("[()]", x) & grepl("^[()[:alnum:]_.]+$", x)
isFunCall("a(b)")
## [1] TRUE
isFunCall("a(b(c))")
## [1] TRUE
isFunCall("d")
## [1] FALSE