2014-01-12 5 views
2

Я строй блестящего приложения, где пользователи будут вводить текст в поле 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 

Предложения приветствуются, спасибо!

ответ

2

Начать с:

instring <- "1.1* max(a,b) * e* exp(1) * (sqrt(abs(x_1)))^(x2y) * min(maxy) * (b2^2)/sqrt(pi) /alpha + betax - gamma" 
(vars <- all.vars(parse(text=instring))) 
## [1] "a"  "b"  "e"  "x_1" "x2y" "maxy" "b2" "pi" "alpha" 
## [10] "betax" "gamma" 

Вы не хотите "e", "pi" или "gamma", так:

constants <- c("e","pi","gamma") 
setdiff(vars,constants) 
## [1] "a"  "b"  "x_1" "x2y" "maxy" "b2" "alpha" "betax" 
+0

Это было красиво и кратким!Спасибо, Бен. – PatrickT

Смежные вопросы