我正在循环使用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
(因为它们是字符而不是数字。
为什么不是这种情况?
答案 0 :(得分:2)
这里有两个问题:数据类型问题和循环问题。
与R中的几乎所有函数一样,strsplit
是矢量化的,因此它的返回值适用于其输入为“原子”值(在R中为长度为1的矢量)或实际值的情况。向量:即它的值是一个列表,其每个元素将包含与每个向量元素的分割字符串的值相对应的分割:
str( strsplit( "123", "" ) )
List of 1
$ : chr [1:3] "1" "2" "3"
您的循环因此在列表的元素上运行每次迭代。在您的示例中,strsplit
的输入是长度为1的向量,因此其值为长度为1的列表,并且循环在长度为3的包含空字符串的字符向量上运行了一次输入向量中单个元素的分割。
as.numeric
是强制性函数,将尽最大努力将其参数转换为数字矢量,因此,即使其输入不是,其其值也将为数字。 / em>。 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 ) ) )
}