假设我希望我的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
}
问题:
我知道is.na(n)
表示如果n为空(不可用),那么如果用户按下输入is.na(n)
则变为TRUE
。这是对的吗?
含义是什么:n <- ifelse(grepl("\\D",n),-1,as.integer(n)
?
如何检查用户是否输入(a,b,c,d,...)?
感谢那些可以帮助我的人。
Owusu Isaac
答案 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) }
}