2011-10-10 16 views
5

que tengo un objeto con algunos atributos cuyos valores son números enteros, es decir h =:R: Obtención de valores de atributos como un vector

attr(,"foo") 
[1] 4 
attr(,"bar") 
[1] 2 

y quiero obtener el vector de tipo integer(2), v =:

[1] 4 2 

he encontrado dos maneras torpes para lograr este

as.vector(sapply(names(attributes(h)), function(x) attr(h, x))) 

o:

as.integer(paste(attributes(h))) 

La solución Busco sólo tiene que trabajar para el caso básico que he descrito anteriormente y tiene que ser lo más rápido posible.

Respuesta

16

Bueno, si se puede vivir con los nombres intactos:

> h <- structure(42, foo=4, bar=2) 
> unlist(attributes(h)) 
foo bar 
    4 2 

De lo contrario (! Que en realidad es más rápido),

> unlist(attributes(h), use.names=FALSE) 
[1] 4 2 

El funcionamiento es el siguiente:

system.time(for(i in 1:1e5) unlist(attributes(h)))     # 0.39 secs 
system.time(for(i in 1:1e5) unlist(attributes(h), use.names=FALSE)) # 0.25 secs 
system.time(for(i in 1:1e5) as.integer(paste(attributes(h))))  # 1.11 secs 
system.time(for(i in 1:1e5) as.vector(sapply(names(attributes(h)), 
      function(x) attr(h, x))))        # 6.17 secs 
Cuestiones relacionadas