web-dev-qa-db-fra.com

Existe-t-il un moyen plus simple d'accéder aux attributs d'une classe dans R, puis-je utiliser la notation par points?

J'ai créé un objet dans R qui contient plusieurs attributs. Comment puis-je y accéder facilement?

Je peux faire:

attr(x, attributeName)

ou:

attributes(x)$attributeName

mais aucun d'eux n'est vraiment pratique.

Existe-t-il un moyen plus rapide (comme le point en C++ ou Java)?

27
RockScience

N'utilisez pas d'attributs pour votre objet, utilisez une liste:

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

Bien sûr, cela pourrait ne pas fonctionner si vous étendez un objet existant (par exemple, un vecteur), mais d'après mon expérience, c'est généralement une meilleure façon de construire des objets.

12
hadley

attributes() renvoie une liste nommée. Je l'appellerais une fois et les stockerais, puis j'accéderais via des noms. Il est inutile d'appeler à plusieurs reprises attr() ou attributes() si vous n'êtes pas obligé.

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

qui donne:

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

$bar
[1] "b"

puis accédez de la manière habituelle

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

R> features$foo
[1] "a"
17
Gavin Simpson

il n'y a probablement aucune fonction intégrée qui fait partie de. en C++, mais vous pouvez le définir comme ceci:

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

Exemple d'utilisation de l'attribut match.length renvoyé par regexpr:

Trois chaînes dans un vecteur, la première et la troisième incluent une chaîne intégrée:

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

Utilisez regexpr pour localiser les chaînes incorporées:

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

Les correspondances sont dans la première chaîne (à 9 avec longueur 10) et la troisième chaîne (à 11 avec longueur 15):

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

Vecteur de l'attribut:

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

Utilisez substr et le vecteur attribut pour extraire les chaînes:

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

Vous souhaitez peut-être supprimer les guillemets intégrés de vos chaînes:

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

Une alternative est d'utiliser des regmatches:

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