【问题标题】:What are examples of when seq_along works, but seq produces unintended results?什么是 seq_along 有效但 seq 产生意外结果的例子?
【发布时间】:2012-12-05 20:43:10
【问题描述】:

什么是seq_along 可以工作但seq 会产生意外结果的好例子?

?seq 的文档中我们有:

注意它在第一个参数的类上调度 与参数名称无关。这可能会产生意想不到的后果 如果仅使用一个参数调用它,打算将其视为 along.with:在这种情况下使用seq_along 会更好。

【问题讨论】:

    标签: r seq


    【解决方案1】:

    这应该清楚地表明区别。基本上,seq() 在传递长度为 1 的向量时的行为类似于 seq_along() except,在这种情况下,它的行为类似于 seq_len()。如果这曾经咬过你,你将永远不会再使用seq()

    a <- c(8, 9, 10)
    b <- c(9, 10)
    c <- 10
    
    seq_along(a)
    # [1] 1 2 3
    seq_along(b)
    # [1] 1 2
    seq_along(c)
    # [1] 1
    
    seq(a)
    # [1] 1 2 3
    seq(b)
    # [1] 1 2
    seq(c)
    # [1]  1  2  3  4  5  6  7  8  9 10
    

    值得注意的是,sample() 表现出类似的糟糕行为:

    sample(a)
    # [1] 10  8  9
    sample(b)
    # [1]  9 10
    sample(c)
    # [1]  8  7  9  3  4  1  6 10  2  5
    

    【讨论】:

    • 有没有 sample() 的替代品,或者只使用 as.numeric(sample(as.character(c)))
    • @user1317221_G -- 我刚刚使用了这种想法:safeSample &lt;- function(x) if(length(x) == 1) x else sample(x)。 (试试safeSample(4:5); safeSample(5)。)
    • Sigh 当单个用户发布了您正在搜索的所有答案并且您需要等待 2 天才能进行投票时担心连续投票脚本的悲伤时刻 :(
    • @BhargavRao 哈哈。谢谢你的夸奖;)
    • 应用于空向量时,x &lt;- c()seq(x)seq_along(x) 都返回 integer(0)
    【解决方案2】:

    如果 seq 的输入长度为 1,则 seqseq_along 之间的输出将不同

    x <- 5
    for(i in seq(x)){
        print(x[i])
    }
    #[1] 5
    #[1] NA
    #[1] NA
    #[1] NA
    #[1] NA
    
    for(i in seq_along(x)){
        print(x[i])
    }
    #[1] 5
    

    如果输入是日期向量,我们也会看到差异

    x <- Sys.Date() + 1:5
    seq(x)
    #Error in seq.Date(x) : 'from' must be of length 1
    seq_along(x)
    #[1] 1 2 3 4 5
    

    【讨论】:

    • 那个日期的例子很棒!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2013-10-27
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多