I have created an object in R that contains several attributes. How can I easily access them?
I can do:
attr(x, attributeName)
or:
probably there is no built-in function that is counter part of . in C++, but you can define it like this:
> `%.%` <- function(o, a) attr(o, as.character(substitute(a)))
> x <- 1
> attr(x, "orz") <- 2
> x%.%orz
[1] 2
attributes()
returns a named list. I'd call it once and store them, then access via names. There is no point repeatedly calling either attr()
or attributes()
if you don't have to.
x <- 1:10
attr(x, "foo") <- "a"
attr(x, "bar") <- "b"
(features <- attributes(x))
which gives:
R> (features <- attributes(x))
$foo
[1] "a"
$bar
[1] "b"
then access in the usual way
R> features["foo"]
$foo
[1] "a"
R> features$foo
[1] "a"
Don't use attributes for your object, use a list:
myobj <- structure(list(a = 1, b = 2), class = "myclass")
print.myclass <- function(x, ...) cat("A: ", x$a, " B: ", x$b, "\n", sep = "")
myobj
Of course, this might not work if you're extending an existing object (e.g. vector), but in my experience it's a generally better way to build objects.
Example of using the match.length attribute that is returned from regexpr:
Three strings in a vector, first and third include an embedded string:
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 to locate the embedded strings:
> locations <- regexpr("\"(.*?)\"", data)
Matches are in the first string (at 9 with length 10) and third string (at 11 with length 15):
> locations
[1] 9 -1 11
attr(,"match.length")
[1] 10 -1 15
attr(,"useBytes")
[1] TRUE
Vector from the attribute:
> attr(locations,"match.length")
[1] 10 -1 15
Use substr and the attribute vector to extract the strings:
> quoted_strings=substr( data,
locations,
locations+attr(locations,"match.length")-1 )
> quoted_strings
[1] "\"ch4.html\"" "" "\"appendix.html\""
Maybe you'd like to remove the embedded quote characters from your strings:
> gsub("\"", "", quoted_strings)
[1] "ch4.html" "" "appendix.html"
An alternative is to use regmatches:
> regmatches(data,locations)
[1] "\"ch4.html\"" "\"appendix.html\""