如何检查数值是否为数字?

4

有人能帮我修改下面的函数来检查一个数字是否是数字吗?

# handy function that checks if something is numeric
check.numeric <- function(N){
  !length(grep("[^[:digit:]]", as.character(N)))
}

check.numeric(3243)
#TRUE
check.numeric("sdds")
#FALSE
check.numeric(3.14)
#FALSE

我希望check.numeric()在遇到像3.14这样的小数时返回TRUE


2
为什么 is.numeric 不够用呢? - joran
哦哈哈,我不知道已经有一个内置的R函数可以做到这一点。谢谢,这正是我需要的函数。不过,我还需要帮助。请看下面的评论。 - user1313954
@joran 我正在处理的脚本是 is.numeric(x),其中 x 被赋值为 x<- NA_real_,结果为 TRUE。我该如何修复这个问题? - user1313954
听起来你有两件事要检查:is.numericis.na - joran
4
我相信NA_real_的意义在于同时表示NA和数值型。 - Drew Steen
2个回答

15

您可以使用is.finite来测试值是否为数值且非NA。这适用于数值、整数和复数值(如果实部/虚部都是有限的)。

> is.finite(NA)
[1] FALSE
> is.finite(NaN)
[1] FALSE
> is.finite(Inf)
[1] FALSE
> is.finite(1L)
[1] TRUE
> is.finite(1.0)
[1] TRUE
> is.finite("A")
[1] FALSE
> is.finite(pi)
[1] TRUE
> is.finite(1+0i)
[1] TRUE

13

听起来你想要一个像这样的函数:

f <- function(x) is.numeric(x) & !is.na(x)

感谢您修复了错误(我会给你点赞),但现在我遇到了一个略微不相关的错误:evaluation nested too deeply: infinite recursion / options(expressions=)? - user1313954
1
@user1313954 没有头绪。你需要在另一个问题中询问这个问题。(但一定要提供相关的代码和足够的细节。根据你目前分享的内容,任何人都无法提供帮助。) - joran
@user1313954,你是否调用了函数is.numeric并让它调用is.numeric函数?如果是的话,这将导致无限递归,因为你的函数不断地调用自己。最好使用不同的名称来命名你的函数,否则你可以使用::符号确保调用正确版本的is.numeric函数。 - Greg Snow
@GregSnow,我确实调用了is.numeric函数,并让它调用了is.numeric函数。我把函数名改回 f 并重新编译,但仍然出现相同的错误。你能再次提醒我如何使用 :: 符号来确保我调用了正确版本的 is.numeric 吗? - user1313954
@user1313954,“::”符号只是“base::is.numeric(x)”而已。但你的问题可能是你仍然有错误版本的“is.numeric”被新函数调用。你需要删除它(rm(is.numeric))。 - Greg Snow
@GregSnow 那就是问题所在。它刚刚编译完成。谢谢 Greg。 - user1313954

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接