R 基数中有一个众所周知的不恰当之处,即
seq(0)
返回 c(1, 0)
,而不是人们所期望的 integer(0)
。
我可以编写自己的“安全
seq()
”功能:
sseq <- function(n) if (n==0) integer(0) else seq(n)
但我很好奇是否有一个现有的函数/习惯用法在基本R中可以这样做以节省我编写这个函数的时间。
seq_len(0)
返回 integer(0)
,因为单个参数是所需的长度,而不是从 1 开始的所需端点 ...
当提供整数时,您可以使用与
sequence
具有相同行为的 seq
:
sequence(0)
#integer(0)
sequence(3)
#[1] 1 2 3
如果您指定
length.out
的 len
/length
/seq
参数,则输出相当于 seq_len
:
seq(len = 0)
# integer(0)
seq(len = 3)
# [1] 1 2 3
虽然根据文档
seq_len
要快得多......这让我想知道:
sseq <- function(n) if (n==0) integer(0) else seq(n)
microbenchmark::microbenchmark(
seq_len(1E6),
seq(len = 1E6),
sequence(1E6),
sseq(1E6),
times = 30L
)
Unit: nanoseconds
expr min lq mean median uq max neval cld
seq_len(1e+06) 0 100 286.6667 200 400 1100 30 a
seq(len = 1e+06) 6300 6800 9726.6667 7800 9300 26100 30 a
sequence(1e+06) 631900 644200 983836.6667 649950 659800 5771700 30 b
sseq(1e+06) 5900 6100 68686.6667 7150 9300 1827400 30 a