我想询问是否有办法检查readline()
的结果是否为数字。
因为我需要对这些输入进行数学运算,除了数字和“。”之外的任何字符。将摧毁该计划。
我是否必须逐字处理输入字符串以检查每个字符?或者有一些优雅的方式来做到这一点?
答案 0 :(得分:1)
函数readline()
总是返回一个字符串。您可以通过两种方式处理此问题:
as.numeric()
使用暴力:这将返回任何无法转换为数字NA
的内容。然后,您可以使用is.na()
查看是否有效。grepl()
,您可以为向量的每个元素获取TRUE/FALSE
值,指示是否找到了某个字符。尝试以下方法:
x <- readline("give a number: ")
if(grepl("[^[:digit:]\\.-]",x)) stop("This is not a number") else "Hooray"
工作原理如下:
> x <- readline("give a number: ")
give a number: -23.48
> if(grepl("[^[:digit:]\\.-]",x)) stop("This is not a number") else "Hooray"
[1] "Hooray"
> x <- readline("give a number: ")
give a number: -25.645)
> if(grepl("[^[:digit:]\\.-]",x)) stop("This is not a number") else "Hooray"
Error: This is not a number
如果你想彻底检查某些东西是否被格式化为数字(包括科学记数法),这是一个经典的正则表达式来测试它:
"ˆ[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$"
那就是:
x <- readline("give a number: ")
isnumber <- grepl("ˆ[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$",x)
if(!isnumber) stop("X is not a number") else "Hooray"