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
时:
有两个元素:1,2seq(1,2)
有一个元素:1seq(1,1)
有两个元素:1,0seq(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
不是空的事实。