Как правило, следует избегать синтаксического анализа ввода произвольной строки от пользователей. Обычно этого можно избежать с помощью соответствующей разработки программного обеспечения.
В любом случае, просто извлеките язык из выражения:
make_function(alist(a = 1, b = 2), parse(text = 'a^b')[[1]])
Редактировать:
Просто чтобы показать, как вы можете проверить по белому списку (без регулярных выражений):
whitelist <- c("+", "*", "-", "/", "^", "**", "%%", "%/%", "sin", "cos", "tan", "abs") #etc.
expr <- parse(text = "cos(x)^sin(x)*abs(x)")
foo <- function(e) if (length(e) > 1) lapply(as.list(e), foo) else return(e)
funs <- unlist(foo(expr[[1]]))
funs <- funs[vapply(funs, function(x) {x <- eval(x); is.function(x) | is.primitive(x)}, FUN.VALUE = TRUE)]
all(vapply(funs, function(x) as.character(x) %in% whitelist, FUN.VALUE = TRUE))
Разбор и оценка произвольного кода в общедоступном блестящем приложении - это угроза безопасности. Эта проверка гарантирует, что может использоваться только предопределенный набор функций. Если вы не уклоняетесь от мелких рисков, вы можете просто использовать черный список (запрещающий такие функции, как system
, system2
, shell
и т. Д.).