Как правильно проверить ввод символов (буквенных) в R? - PullRequest
2 голосов
/ 18 мая 2011

Предположим, я хочу, чтобы пользователь моей программы R ввел положительное число.

Если он вводит отрицательный знак или вводит любой алфавит (a, b, c, d и т. Д.), Я бы хотел, чтобы он пытался, пока он не введет желаемое положительное число.

Как проверить, вводит ли он символ (a, b, c и т. Д.)?

Например, если у меня есть: (На самом деле, кто-то на этом сайте помог мне правильно написать этот код, но я не понимаю некоторые вещи, особенно, третью строку, как я указал "#explanation of this line" в коде

n <- -1
while(is.na(n) | (n < 1)  ){
  n <- readline("enter a positive integer for the number of simulations: ")
  n <- ifelse(grepl("\\D",n),-1,as.integer(n)) #explanation of this line
}

Вопросы:

  1. Я знаю, что is.na(n) означает, что если n равно нулю (недоступно), то, если пользователь нажимает, введите is.na(n), становится TRUE. Это правильно?

  2. что означает: n <- ifelse(grepl("\\D",n),-1,as.integer(n)?

  3. Как проверить, вводит ли пользователь (a, b, c, d, ...)?

Спасибо тем, кто может прийти мне на помощь.

Овусу Исаак

Ответы [ 2 ]

5 голосов
/ 18 мая 2011

См. ?regex и ?grep, и в моем ответе вы скопировали код.

Q1: если пользователь просто нажимает клавишу ввода, n становится "", которое, когда оно превращается в целое число, становится NA.

> n <- ""
> as.integer(n)
[1] NA

Q2: grepl - это функция, которая проверяет, соответствуют ли значения в векторе регулярному выражению (?regex) и возвращает логический вектор. В этом случае регулярное выражение "\\D". \D означает все, что не является цифрой, включая знак минус или точку. Обратная косая черта должна быть экранирована, поэтому она двойная. Так что, если он соответствует чему-то, что не является цифрой, n станет -1. Теперь "" ничего не подходит, поэтому n станет as.integer (n) и, следовательно, NA (см. Q1).

Q3: для проверки писем вы можете использовать регулярные выражения -again- или %in% letters:

> n <- "a"
> grepl("[a-z]",n)
[1] TRUE
> n %in% letters
[1] TRUE

Или, если вы хотите использовать как строчные, так и прописные буквы:

> n <- c("a","A")
> grepl("[[:alpha:]]",n)
[1] TRUE TRUE
> grepl("(?i)[a-z]",n)
[1] TRUE TRUE

Это только некоторые из возможностей. Прочитайте файлы справки, к которым я обращаюсь, и поиграйте с ними некоторое время. Регулярные выражения очень эффективны, когда вы освоите их.

1 голос
/ 18 мая 2011

Если вы не хотите изучать регулярные выражения (но вы должны ), тогда этот код будет выполнять ту же задачу:

n<--1
while(is.na(n) | (n < 1)  ){
  n <- readline("enter a positive integer for the number of simulations: ")
  if( !is.integer(as.integer(n)) ) {n <- -1} else { 
                                   n <- as.integer(n) }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...