首页 > 解决方案 > 意外行为 seq() 函数

问题描述

我试过seq(0:2)了,它有一个奇怪的输出。基本上,为什么:

seq(from= c(0,1,2))

输出:

1 2 3

?

标签: r

解决方案


基本上,如果您将长度 > 1 的向量传递给seq,它的语义会反映seq_along或 的语义seq(along.with = …)。也就是说,它为您提供了该向量的索引向量:

seq_along(0 : 2)
# [1] 1 2 3
seq(along.with = 0 : 2)
# [1] 1 2 3

奇怪的seq是,没有根据 来实现seq_along,而后者可能更有效。相反,相关部分的当前(R 4.1)实现seq如下所示。

lf <- length(from)
return(if (mode(from) == "numeric" && lf == 1L) {
    if (!is.finite(from)) stop("'from' must be a finite number")
    1L:from
} else if (lf) 1L:lf else integer())

并且实现seq(along.with = …)还是不一样的:

length.out <- length(along.with)
return(if (length.out) seq_len(length.out) else integer())

……顺便说一句,这是多余的;它可以缩短为以下内容:

length.out <- length(along.with)
return(seq_len(length.out))

…老实说,默认seq功能的实现有点乱。


推荐阅读