Pregunta ¿Hay alguna manera más fácil de acceder a los atributos de una clase en R? ¿Puedo usar la notación de puntos?


He creado un objeto en R que contiene varios atributos. ¿Cómo puedo acceder fácilmente a ellos?

Puedo hacer:

attr(x, attributeName)

o:

attributes(x)$attributeName

pero ninguno de ellos es realmente conveniente.

¿Hay una manera más rápida (como el punto en C ++ o Java)?


21
2018-06-23 05:05


origen


Respuestas:


No use atributos para su objeto, use una lista:

myobj <- structure(list(a = 1, b = 2), class = "myclass")
print.myclass <- function(x, ...) cat("A: ", x$a, " B: ", x$b, "\n", sep = "")
myobj

Por supuesto, esto podría no funcionar si está extendiendo un objeto existente (por ejemplo, vector), pero en mi experiencia es una forma generalmente mejor de construir objetos.


14
2018-06-23 16:21



attributes() devuelve una lista con nombre. Lo llamaría una vez y los almacenaría, luego accedería a través de nombres. No tiene sentido llamar repetidamente attr() o attributes() si no tienes que hacerlo

x <- 1:10
attr(x, "foo") <- "a"
attr(x, "bar") <- "b"
(features <- attributes(x))

lo que da:

R> (features <- attributes(x))
$foo
[1] "a"

$bar
[1] "b"

luego acceda de la manera habitual

R> features["foo"]
$foo
[1] "a"

R> features$foo
[1] "a"

9
2018-06-23 08:55



probablemente no haya una función incorporada que sea parte contraria de. en C ++, pero puedes definirlo así:

> `%.%` <- function(o, a) attr(o, as.character(substitute(a)))
> x <- 1
> attr(x, "orz") <- 2
> x%.%orz
[1] 2

8
2018-06-23 05:49



Ejemplo de uso del atributo match.length que se devuelve desde regexpr:

Tres cadenas en un vector, primero y tercero incluyen una cadena incrustada:

data=c("<a href=\"ch4.html\">Chapter 1</a>",
       "no quoted string is embedded in this string",
       "<a   href=\"appendix.html\">Appendix</a>")

Use regexpr para localizar las cadenas incrustadas:

> locations <- regexpr("\"(.*?)\"", data)

Los emparejamientos están en la primera cuerda (en 9 con longitud 10) y en la tercera cuerda (en 11 con longitud 15):

> locations
[1]  9 -1 11
attr(,"match.length")
[1] 10 -1 15
attr(,"useBytes")
[1] TRUE

Vector del atributo:

> attr(locations,"match.length")
[1] 10 -1 15

Use substr y el vector de atributo para extraer las cadenas:

> quoted_strings=substr( data, 
                         locations, 
                         locations+attr(locations,"match.length")-1 )    
> quoted_strings
[1] "\"ch4.html\""      ""                  "\"appendix.html\""

Tal vez le gustaría eliminar los caracteres de comillas incrustados de sus cadenas:

> gsub("\"", "", quoted_strings)
[1] "ch4.html"      ""              "appendix.html"

Una alternativa es usar los regmatches:

> regmatches(data,locations)
[1] "\"ch4.html\""      "\"appendix.html\""

2
2018-01-31 18:31