R 生成可能为空的整数序列的最佳方法是什么?

R 生成可能为空的整数序列的最佳方法是什么?,r,R,seq(n,m)无法生成空序列, 因为序列seq(n,m)中的步进方向从向上切换到向下 当m小于n时: seq(1,2)有两个元素:1,2 seq(1,1)有一个元素:1 seq(1,0)有两个元素:1,0 不幸的是,seq没有可选参数来强制执行步骤的方向。 我已经在R包中发现了两个bug,其中seq(1,n)(或1:n)是 小于或等于n,但n的所有正整数的序列可能为0。 目前我的权宜之计是像这样难看的建筑 ifelse(n>=1,seq(1,n),integer(0)) 或 或者

seq(n,m)
无法生成空序列, 因为序列
seq(n,m)
中的步进方向从向上切换到向下 当
m
小于
n
时:

  • seq(1,2)
    有两个元素:1,2
  • seq(1,1)
    有一个元素:1
  • seq(1,0)
    有两个元素:1,0
不幸的是,
seq
没有可选参数来强制执行步骤的方向。
我已经在R包中发现了两个bug,其中
seq(1,n)
(或
1:n
)是 小于或等于
n
,但
n
的所有正整数的序列可能为0。 目前我的权宜之计是像这样难看的建筑

 ifelse(n>=1,seq(1,n),integer(0))

或者,如果n至少是非负的

 seq(0,n)[-1]
乍一看,第一个表达式看起来没那么糟糕,但是如果
n
是一个较长的表达式,那么它们确实很糟糕。 如果
n
为负值,则最后一个选项不起作用:

> n <- -3
> seq(0,n)[-1]
[1] -1 -2 -3
>n序列(0,n)[-1]
[1] -1 -2 -3

有没有更好的方法来生成一个可能为空的整数序列?

如果您对
for
循环在R中的工作方式不满意,可能您更喜欢使用迭代器包的
foreach
循环:

library(iterators)
library(foreach)

foreach(i = icount(3), .combine = "c") %do% {i}
#[1] 1 2 3
foreach(i = icount(-3), .combine = "c") %do% {i}
#NULL
foreach(i = icount(0), .combine = "c") %do% {i}
#NULL

如果您对R中
for
循环的工作方式不满意,那么您可能更喜欢使用迭代器包的
foreach
循环:

library(iterators)
library(foreach)

foreach(i = icount(3), .combine = "c") %do% {i}
#[1] 1 2 3
foreach(i = icount(-3), .combine = "c") %do% {i}
#NULL
foreach(i = icount(0), .combine = "c") %do% {i}
#NULL

“我已经在R包中发现了两个错误,其中seq(1,n)(或1:n)是所有小于或等于n的正整数的序列,但n可能是0。”——>
seq_len(n)
“如果n是一个较长的表达式,它们看起来很糟糕”,只需定义seq函数,例如:
myseq@Roland:
seq len(n)
如果
n
为负值,则抛出错误
seq_len(max(0,n))
有效,但并不优于
seq(1,length.out=max(0,n))
。如果序列不应该从1开始,它会变得更糟。当然,如果
n
为负值,
seq_len
会抛出一个错误。这是件好事。程序员的任务是确保
n
只能取合理的值。请再次阅读我的评论,包括报价。另外,请考虑问一个明确定义的具体问题。”罗兰:看看我回答的第二个问题。在那里你可以看到一个bug,它是基于
1:0
不是空的事实。“我已经在R包中发现了两个bug,其中seq(1,n)(或1:n)是所有小于或等于n的正整数的序列,但n可能是0。”-->
seq_len(n)
“如果n是一个较长的表达式,它们看起来很糟糕”,只需定义seq函数,例如:
myseq@Roland:
seq_len(n)
如果
n
为负,则抛出错误
seq_len(max(0,n))
有效,但并不优于
seq(1,length.out=max(0,n))
。如果序列不应该从1开始,它会变得更糟。当然,如果
n
为负值,
seq_len
会抛出一个错误。这是件好事。程序员的任务是确保
n
只能取合理的值。请再次阅读我的评论,包括报价。另外,请考虑问一个明确定义的具体问题。”罗兰:看看我回答的第二个问题。在这里,您可以看到一个bug,它基于
1:0
不是空的事实。