R 有没有办法检查读线输入的字符是否为数字?

R 有没有办法检查读线输入的字符是否为数字?,r,regex,readline,numeric,R,Regex,Readline,Numeric,我想问一下是否有办法检查readline()的结果是否为数字 因为我需要对这些输入进行数学运算,所以除了数字和“.”以外的任何字符都会破坏程序 我必须逐字检查输入字符串以检查每个字符吗?或者有一种优雅的方法可以做到这一点?函数readline()总是返回字符串。您可以通过两种方式处理此问题: 对as.numeric()使用蛮力:这将返回任何无法转换为数值的内容作为NA。然后,您可以使用is.na()检查这是否有效 使用正则表达式。使用grepl()可以为向量的每个元素获得一个TRUE/FALS

我想问一下是否有办法检查
readline()
的结果是否为数字

因为我需要对这些输入进行数学运算,所以除了数字和“.”以外的任何字符都会破坏程序


我必须逐字检查输入字符串以检查每个字符吗?或者有一种优雅的方法可以做到这一点?

函数
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: ")
isnumber <- grepl("ˆ[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$",x)
if(!isnumber) stop("X is not a number") else "Hooray"

x
readline()
的值是“长度为1的字符向量”(引用
?readline
)。为什么不把它包装成
as.numeric()
,让你的程序对
NA
输入保持健壮?@apom使用as.numeric的问题是默认情况下它会改变输入,例如,如果输入是“2,8”而不是“2.8”,结果将是数字2 regexp有一些潜在的漏洞;作为一个测试用例,
“13.234.2342”
怎么样?
+23
是法定号码吗?
1.0e23
怎么样@BenBolker第二个正则表达式解决了所有问题。
"ˆ[+-]?(\\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"