Кажется, что в R вокруг eval()
есть много функциональности (по крайней мере, больше, чем я привык). Есть ли способ проверить, будет ли строка (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)"
может быть str
пределах boo(x)
.
То, что я пытаюсь сделать: я хотел бы иметь R-функции, которые являются обертками на другом языке. Но вместо обычного eval2other('set x=2;set y=x*x')
(то есть, когда строка на other
языке оценивается other
), я бы предпочел, чтобы функция имела аналогичный стиль для R. я у меня большая часть синтаксического анализа завершена, но у меня возникают проблемы с вещью типа "boo(boo(Y))"
. У меня есть решение, но оно действительно волосатое и сложно отлаживать (даже с пакетами, такими как debug
).
Здесь другой способ, который будет работать для префиксных вызовов, но не для вызовов infix, таких как %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
Это далеко не идеальное, но оно короткое и, может быть, достаточно хорошее:
isFunCall <- function(x) grepl("[()]", x) & grepl("^[()[:alnum:]_.]+$", x)
isFunCall("a(b)")
## [1] TRUE
isFunCall("a(b(c))")
## [1] TRUE
isFunCall("d")
## [1] FALSE