基础 R 中的“安全”seq() 习惯用法?

问题描述 投票:0回答:3

R 基数中有一个众所周知的不恰当之处,即

seq(0)
返回
c(1, 0)
,而不是人们所期望的
integer(0)

我可以编写自己的“安全

seq()
”功能:

sseq <- function(n) if (n==0) integer(0) else seq(n)

但我很好奇是否有一个现有的函数/习惯用法在基本R中可以这样做以节省我编写这个函数的时间。

r sequence
3个回答
4
投票

seq_len(0)
返回
integer(0)
,因为单个参数是所需的长度,而不是从 1 开始的所需端点 ...


3
投票

当提供整数时,您可以使用与

sequence
具有相同行为的
seq

sequence(0)
#integer(0)

sequence(3)
#[1] 1 2 3

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 
© www.soinside.com 2019 - 2024. All rights reserved.