Как сделать последовательность вроде 1: n, 1: (n-1), ... 1: 2, 1? - PullRequest
0 голосов
/ 13 сентября 2018

n - это целое число. Последовательность, которую я хотел бы:

1:n, 1:(n-1), 1:(n-2), ... , 1:3, 1:2, 1

Примечание редактора:

В R 1:n-1 отличается от 1:(n-1). Будьте осторожны.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Возможно, решение не будет улучшено.Но просто для любопытства очень обобщенный ришский способ будет выглядеть примерно так:

unlist(lapply(4:1, function(x) 1:x))
[1] 1 2 3 4 1 2 3 1 2 1
0 голосов
/ 13 сентября 2018

Столь же коротко, как sequence(n:1).

sequence(4:1)
#[1] 1 2 3 4 1 2 3 1 2 1

Функция не загадывает.

function (nvec) 
unlist(lapply(nvec, seq_len))

Итак, ответ снорама заново изобретает колесо. Но вызов seq_len происходит быстрее, чем вызов других опций, поскольку это примитивная функция (функция C) с одним аргументом.

sequence2 <- function (nvec) unlist(lapply(nvec, seq.int, from = 1))
sequence3 <- function (nvec) unlist(lapply(nvec, function(x) 1:x))
sequence4 <- function (nvec) unlist(lapply(nvec, seq.default, from = 1))
sequence5 <- function (nvec) unlist(lapply(nvec, seq, from = 1))

library(microbenchmark)
microbenchmark(sequence(100:1), sequence2(100:1),
               sequence3(100:1), sequence4(100:1), sequence5(100:1))
#Unit: microseconds
#             expr     min        lq      mean    median        uq      max
#  sequence(100:1)  93.292  160.9325  205.5617  173.1995  200.0005 1157.201
# sequence2(100:1) 117.625  226.2120  308.4929  248.1055  280.8625 5477.710
# sequence3(100:1) 126.289  233.7875  365.6455  268.0495  301.8860 8808.911
# sequence4(100:1) 606.301 1195.4795 1463.3400 1237.5580 1344.3145 9986.619
# sequence5(100:1) 944.099 1864.3920 2063.3712 1942.2240 2119.3930 8581.593

## speed comparison
    seq     <  seq.default  <  function(x) 1:x  <  seq.int  <       seq_len
s3 generic       normal      light-weighted user  primitive   1-argument primitive
...