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)?
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.
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"
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
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\""