2012-06-06 13 views
9

Más de una vez la "inteligencia" de la función de R seq me ha golpeado fuertemente en el caso esquina cuando lower == upper - 1:la construcción de secuencias que crea una secuencia vacía si es más bajo es mayor que el límite superior

> 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 

no estoy preguntando las razones de este extraño comportamiento: supongo que ahora es solo un legado con el que tenemos que vivir. En su lugar, me gustaría saber si cualquier paquete implementa un operador seq que devuelve una secuencia vacía en este caso, como la siguiente:

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) 

Respuesta

13

Es una buena práctica utilizar seq_len(n) en lugar de 1:n exactamente por esta razón - si n=0 luego se obtiene una secuencia vacía en lugar de c(1,0).

Esperanza esto ayuda

+0

¡Exactamente lo que necesito, gracias! No lo he probado antes. Lástima que la documentación no incluya un ejemplo para 'seq_len (0)' ... – krlmlr

+1

¡Ningún problema en absoluto, y gracias por mi primer tic! :) –

3

Es muy desafortunado que ambos: el operador y ss() la función no pueden manejar este caso. La mejor respuesta que he encontrado hasta ahora es la siguiente:

seq(a,b,length = max(0,b-a+1)) 
Cuestiones relacionadas