2012-06-06 9 views
9

Più di una volta la "bravura" della funzione di R seq mi ha colpito male nel caso in angolo quando lower == upper - 1:costruzione sequenza che crea una sequenza vuota se inferiore è maggiore di limite superiore

> 1:0 
[1] 1 0 
> seq(1, 0) 
[1] 1 0 
> seq(1, 0, 1) 
Error in seq.default(1, 0, 1) : wrong sign in 'by' argument 

Io non sono chiedendo le ragioni di questo strano comportamento - presumo che ora sia solo un'eredità con cui dobbiamo convivere. Invece, mi piacerebbe sapere se qualsiasi pacchetto implementa un operatore seq che restituisce una sequenza vuota, in questo caso, come il seguente: le buone pratiche

safe.seq.int <- function(from, to, by=1) { 
    if (from > to) integer(0) else seq.int(from, to, by) 
} 

> safe.seq.int(1, 0) 
integer(0) 

risposta

13

E 'da usare seq_len(n) invece di 1:n proprio per questo motivo - se n=0 quindi si ottiene una sequenza vuota anziché c(1,0).

Spero che questo aiuti

+0

Esattamente quello che mi serve, grazie! Non l'ho provato prima. Peccato che la documentazione non includa un esempio per 'seq_len (0)' ... – krlmlr

+1

Nessun errore - e grazie per il mio primo segno di spunta! :) –

3

E 'molto spiacevole che sia: dell'operatore e seguenti() funzione non può gestire questo caso. La migliore risposta che ho trovato è la seguente:

seq(a,b,length = max(0,b-a+1)) 
Problemi correlati