检查R中字符(字母)数据输入的正确方法是什么?

Son*_*Son 2 r

假设我希望我的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
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 我知道这is.na(n)意味着如果n为null(不可用),那么如果用户按下Enter则is.na(n)成为TRUE.那是对的吗?

  2. 是什么意思:n <- ifelse(grepl("\\D",n),-1,as.integer(n)

  3. 如何检查用户是否输入(a,b,c,d,...)?

感谢那些可以帮助我的人.

Owusu Isaac

Jor*_*eys 5

看到?regex?grep,我的回答你复制了代码.

Q1:如果用户只按下enter,则n变为"",当变为整数时,将变为NA.

> n <- ""
> as.integer(n)
[1] NA
Run Code Online (Sandbox Code Playgroud)

Q2:grepl是一个函数,用于检查向量中的值是否适合正则表达式(?regex)并返回逻辑向量.在这种情况下,正则表达式是"\\D".\D指任何不是数字的东西,包括负号或点.反斜杠必须被转义,这就是为什么它是双倍的.因此,如果它适合任何不是数字的东西,n将变为-1.现在""不适合任何东西,因此n将变为as.integer(n),因此NA(参见Q1).

问题3:对于检查字母,您可以使用-again-正则表达式,或者%in% letters:

> n <- "a"
> grepl("[a-z]",n)
[1] TRUE
> n %in% letters
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

或者,如果您想同时使用小写和大写:

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

这些只是一些可能性.阅读我所提及的帮助文件并暂时使用它.一旦掌握了它,正则表达式就非常强大.