r-is.numeric如何在循环中工作



我在循环中使用is.numeric,它的行为似乎不像我期望的那样。

> for (d in strsplit("123","")){
>     print(as.numeric(d))
>     print(is.numeric(d))
>     }

返回。。。

[1] 1 2 3
[1] FALSE

我希望它的计算结果是"1",然后是"2",再是"3"(与as.numeric计算每个字符的方式相同(,每次打印出一个FALSE(因为它们是字符而不是数字(。

为什么不是这样?

这里有两个问题:数据类型问题和循环问题。

像R中几乎所有的函数一样,strsplit是矢量化的,因此它的返回值适用于其输入是"原子"值(在R中,长度为1的向量(或实际向量的情况:即它的值是一个列表,其中的每个元素都将包含与每个向量元素的拆分字符串的值相对应的拆分:

str( strsplit( "123", "" ) )
List of 1
$ : chr [1:3] "1" "2" "3"

因此,您的循环在列表的元素上运行每次迭代。在您的示例中,strsplit的输入是长度为1的向量,因此其值是长度为一的列表,循环在长度为3的字符向量上运行一次,该字符向量包含输入向量中单个元素的空字符串分割。

as.numeric是一个强制函数,它将尽最大努力将其参数转换为数字向量,因此即使其输入不是,其值也将是数字is.numeric测试其输入是否为数字,如果不是,则将具有值FALSE。比较:

for ( d in strsplit( "123","" ) ) {
print( as.numeric( d ) )
print( is.numeric( d ) ) 
print( is.numeric( as.numeric( d ) ) )
}
for ( d in strsplit( "123", "" )[[1]] ) {
print( as.numeric( d ) )
print( is.numeric( d ) ) 
print( is.numeric( as.numeric( d ) ) )
}

最新更新