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

时间:2011-05-18 10:58:21

标签: 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
}

问题:

  1. 我知道is.na(n)表示如果n为空(不可用),那么如果用户按下输入is.na(n)则变为TRUE。这是对的吗?

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

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

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

    Owusu Isaac

2 个答案:

答案 0 :(得分:5)

请参阅?regex?grep,以及我从中复制代码的答案。

Q1:如果用户只按下回车,则n变为"",当变成整数时,n将变为NA。

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

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

或者,如果你想同时拥有小写和大写:

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

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

答案 1 :(得分:1)

如果您不想学习正则表达式(但应该),那么此代码将执行相同的任务:

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) }
}