В настоящее время я работаю над блестящим проектом R, который необходимо загрузить в набор данных и добавить критерии для фильтрации наблюдений.
Моя проблема заключается в том, что когда пользователь вводит «флаг = 1 и условие> = 2», следующее будет преобразовано в «флаг == 1 и условие> == 2», чтобы R мог его прочитать, что неверно и определенно показывает ошибку. Есть ли какая-либо функция/пакет, который может заставить пользователя, не являющегося пользователем R, ввести желаемое условие?
.....if (input$criteria_ad == ""){
dat <- dat0
}else if (endsWith(file_ad$name, '.sas7bdat')){
ad <- data.frame(setDT(read_sas(file_ad$datapath)))
rep_str <- c('<='='<=','>='='>=','='='==','and'='&','or'='|')
ad <- filter(ad, eval(parse(text = str_replace_all(input$criteria_ad, rep_str))))
dat <- inner_join(dat0, ad, by ='ID')
}......
Спасибо neilfws, но пользователь предпочитает использовать более гибкий ввод, поскольку переменные в наборе данных разнообразны.
Я думаю, вы должны использовать границы слов регулярных выражений.
С границами слов:
rep_str <- c('<='='<=','>='='>=','\\b=\\b'='==','and'='&','or'='|')
str_replace_all("flag=1 and condition>=2", rep_str)
# [1] "flag==1 & condition>=2"
Вы можете сделать это для всех, а не только для единственного числа = с
rep_str <- c('<='='<=','>='='>=','='='==','and'='&','or'='|')
names(rep_str) <- paste0("\\b", names(rep_str), "\\b")
rep_str
# \\b<=\\b \\b>=\\b \\b=\\b \\band\\b \\bor\\b
# "< = " "> = " "= = " "&" "|"
str_replace_all("flag=1 and condition>=2", rep_str)
# [1] "flag==1 & condition>=2"
К вашему сведению, поскольку первые два элемента вашего rep_str не изменяются, мы можем опустить их из вектора.
Если вы используете Shiny, я думаю, что имеет смысл использовать виджет управления (например, ползунок), чтобы пользователи могли вводить критерии?