Я строй блестящего приложения, где пользователи будут вводить текст в поле TextInput, что-то вроде этого:R: создать список допустимых имен из строки
str <- "1.1* max(a,b) * e* exp(1) * (sqrt(abs(x_1)))^(x2y) * min(maxy) * (b2^2)/sqrt(pi) /alpha + betax - gamma"
Текста представляет собой математическое выражение, включающее
- действительные числа: 1,1, 2
- известные математические константы: е, пи, гамма
- известные математические функции: макс(), ехр(), SQRT(), ABS(), мин()
- имена переменных: а, б, x_1, х2у, Maxy, b2, альфа, Betax
- арифметические операции: +, -, *, /,^
- сепараторы и подобные: (,).
В дополнение к заранее заданным константам, таким как гамма, я также создам список «запрещенных» имен, таких как «цифры» или «база», поскольку они могут отображаться как аргументы для некоторых математических функции.
Моя цель состоит в том, чтобы извлечь из выражения всех допустимых имен переменных и сохранять их в списке:
(a, b, x_1, x2y, maxy, b2, alpha, betax)
или, возможно,
("a", "b", "x_1", "x2y", "maxy", "b2", "alpha", "betax")
я был в состоянии справиться с ситуацией где допустимы только одиночные буквы как имена переменных, случай, когда имена переменных содержат только буквы и всегда разделены пробелом, но я не мог справиться с описанной ситуацией.
Для чего это стоит, вот мой лучший выстрел:
# multi-gsub-to-1
mgsub21 <- function(pattern, replacement, x, ...) {
for (i in 1:length(pattern)) {
x <- gsub(pattern[i], replacement, x, ...)
}
x
}
ops <- list("\\+","\\-","\\*","\\/","\\^",",","\\(","\\)","\\.")
math <- list("log","logb","log10","log2","exp","sqrt"
,"cos","sin","tan","acos","asin","atan","atan2","cosh","sinh","tanh","acosh","asinh","atanh"
,"max","min","round","floor","ceiling","trunc","sign","abs","mean","median","mode","base","digits")
cst <- list("pi","Pi","e","gamma")
pattern <- unlist(list(ops,cst,math))
replacement <- " "
str2 <- mgsub21(pattern,replacement,str)
str2
# [1] "1 1 a b xp 1 x_1 x2y y b2 2 alpha b tax "
str2 <- gsub("[0-9]+", " ", str2)
str2 <- gsub(" {2,}", " ", str2)
str2
# [1] " a b xp x_ x y y b alpha b tax "
Проблемы с выше, включают:
- Betax становится б налога после я удаляю е
- ехр (1) становится хр 1 после удаления e
- maxy становится y после удаления max
- не имеет отношения к переменным, содержащим Номера
я получаю:
a b xp x_ x y alpha tax
Ожидаемый ответ:
a b x_1 x2y maxy b2 alpha betax
Предложения приветствуются, спасибо!
Это было красиво и кратким!Спасибо, Бен. – PatrickT