Is there an easier way to access attributes of a class in R, can I use dot notation?

后端 未结 4 1827
暖寄归人
暖寄归人 2021-01-30 17:46

I have created an object in R that contains several attributes. How can I easily access them?

I can do:

attr(x, attributeName)

or:

相关标签:
4条回答
  • 2021-01-30 17:50

    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
    
    0 讨论(0)
  • 2021-01-30 17:51

    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"
    
    0 讨论(0)
  • 2021-01-30 18:00

    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.

    0 讨论(0)
  • 2021-01-30 18:01

    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\""
    
    0 讨论(0)
提交回复
热议问题