R – определить, может ли строка быть оценена для функции без использования eval()

Вопрос:

Кажется, что в 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

Ответ №1

Это далеко не идеальное, но оно короткое и, может быть, достаточно хорошее:

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

Оцените статью
TechArks.Ru
Добавить комментарий