Синтаксический анализ cтроки в R

Я написал программу-калькулятор, в которой Пользователь вводит два числа и арифметическую операцию между числами, затем нажимает Enter и получает результат, точнее сделал синтаксический анализ строки, но он не работает. С чем это может быть связано? Также я написал код, чтобы можно было выйти из функции

add<- function(x,y){
  return(x+y)
}
  subtract <- function(x,y){
  return(x-y)
}

  div <- function(x,y){
    if(y==0){
      return("Error")
      break
    }
  else if(y!=0){
    return(x%/%y)
  }
  
}

raise_to_degree<- function(x,y){
  return(x**y)
}
coren<-function(x){
  return(sqrt(x))
}


{
  res<-NA
   repeat{
print("7.Для выхода из программы нажмити 9", quote=FALSE)
us <-
  readline(prompt = ("Enter: ")) #пользователь вводит данные

if(us== 9){
  break
}

c_of_user_s <-
  unlist(strsplit(us, split = '')) #разбиваем строку
 
if (is.numeric(result) == TRUE) {
  num1 <- result #Грубо вносим result в num1
}

us_chosen_operation <-
  c_of_user_string[2] #ищем операцию в введенной строке
operations_vector <-
  c('+', '-', '*', '/') #вектор, содержащий операции
choice <- match(us_chosen_operation, operations_vector)
operator <- switch(choice, ' + ', ' - ', ' * ', ' / ', ' ^ ')

result <-
  switch(
    choice,
    add(num1, num2),
    subtract(num1, num2),
    multiply(num1, num2),
    divide(num1, num2)
  )
print(paste(num1, operator, num2, "=", result))

Ответы (1 шт):

Автор решения: aleksandr barakin

чем разбирать все ваши логические ошибки (типа отсутствия присвоения ключевым переменным num1 и num2), просто переписал без них и более компактно:

repeat {
  readline(prompt = "введите выражение или 0 для выхода: ") -> ввод
  if (ввод == "0") { break }
  unlist(strsplit(ввод, split="")) -> массив
  as.numeric(массив[1]) -> число1
  массив[2] -> операция
  as.numeric(массив[3]) -> число2
  switch(операция,
    '+' = число1 + число2,
    '-' = число1 - число2,
    '*' = число1 * число2,
    '/' = число1 / число2,
    '^' = число1 ^ число2,
    'неизвестная операция'
    ) -> результат
  # альтернативный вариант вместо switch:
  # do.call(операция, list(число1, число2)) -> результат
  cat(число1, операция, число2, "=", результат, "\n")
}

ну а вообще для синтаксического разбора лучше использовать подходящие инструменты. например, связку lex и yacc (альтернатива от проекта gnu: flex и bison).

на языке r эта связка реализована в пакете rly. кстати, прямо в readme там приводится пример реализации как раз калькулятора.

→ Ссылка