【问题标题】:How does is.numeric work within a loop?is.numeric 如何在循环中工作?
【发布时间】:2018-07-17 21:32:45
【问题描述】:

我在循环中使用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(因为它们是字符而不是数字) .

为什么不是这样?

【问题讨论】:

  • strsplit 返回一个向量列表,每个传入的值对应一个。这里你只传入“123”,所以你得到一个长度为 1 的列表,你可以传入多个字符串。好像你想要for (d in strsplit("123","")[[1]])

标签: r loops


【解决方案1】:

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

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

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

因此,您的循环会在列表的元素上运行每次迭代。在您的示例中,strsplit 的输入是长度为 1 的向量,因此它的值是长度为 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 ) ) )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多