Thanks. I looks like my example worked because the value of the new attribute had a length greater than 1. That difference in behavior smells like a bug.
> { x <- 1 ; attributes(x)[["attrName"]] <- 2012 ; str(x) } Error in attributes(x)[["attrName"]] <- 2012 : attributes must be a list or NULL > { x <- 1 ; attributes(x)[["attrName"]] <- 2012:2013 ; str(x) } atomic [1:1] 1 - attr(*, "attrName")= int [1:2] 2012 2013 Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com From: Murat Tasan [mailto:mmu...@gmail.com] Sent: Friday, May 10, 2013 10:56 AM To: William Dunlap Cc: r-help@r-project.org Subject: Re: [R] attr vs attributes sure, here's a series of commands/outputs (using R 3.0.0): > x <- letters[1:4] > y <- "foo" > attributes(x) NULL > attributes(x)[[y]] <- "bar" Error in attributes(x)[[y]] <- "bar" : attributes must be a list or NULL > attr(x, y) <- "bar" > attributes(x) $foo [1] "bar" > attributes(x)[[y]] <- "newbar" > attributes(x) $foo [1] "newbar" > cheers! -m On Fri, May 10, 2013 at 12:31 PM, William Dunlap <wdun...@tibco.com<mailto:wdun...@tibco.com>> wrote: > > attributes(my_obj)[[my_attr_name]] <- my_attr_value > > ...fails when my_obj doesn't already have an attribute named my_attr_name. Do you have an example of this? In R-2.15.3 I don't see that problem: > my_obj <- 37:41 > my_attr_name <- "myAttr" > my_attr_value <- as.roman(2012:2013) > attributes(my_obj)[[my_attr_name]] <- my_attr_value > my_obj [1] 37 38 39 40 41 attr(,"myAttr") [1] MMXII MMXIII > attributes(my_obj)[["anotherAttrName"]] <- "another attribute value" > my_obj [1] 37 38 39 40 41 attr(,"myAttr") [1] MMXII MMXIII attr(,"anotherAttrName") [1] "another attribute value" Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com<http://tibco.com> > -----Original Message----- > From: r-help-boun...@r-project.org<mailto:r-help-boun...@r-project.org> > [mailto:r-help-boun...@r-project.org<mailto:r-help-boun...@r-project.org>] On > Behalf > Of Murat Tasan > Sent: Friday, May 10, 2013 8:16 AM > To: Duncan Murdoch > Cc: r-help@r-project.org<mailto:r-help@r-project.org> > Subject: Re: [R] attr vs attributes > > thanks, both. > > the only real difference between the two approaches that i can see is when > assigning _new_ attributes to an object where the attribute name is itself > variable. > something like this: > > > attributes(my_obj)[[my_attr_name]] <- my_attr_value > > ...fails when my_obj doesn't already have an attribute named my_attr_name. > BUT(!) it does work just fine when the attribute named my_attr_name is > already attached to my_obj. > > i guess in the end attr(...) is just easier, but i can also see a spot of > confusion in the 'attributes(x)[[y]] <- z' working sometimes for folks and > sometimes not. > > (to be clear, it's pretty easy to figure out when it does and doesn't work, > but if there's a new programmer coming along and it works the first time, > when the upstream code changes a bit (i.e. the attribute name changes) and > this attribute-setting line then fails, it could be very confusing :-) > > thanks for the thoughts! > > cheers, > > -m > > > > > On Fri, May 10, 2013 at 10:58 AM, Duncan Murdoch > <murdoch.dun...@gmail.com<mailto:murdoch.dun...@gmail.com>>wrote: > > > On 10/05/2013 10:50 AM, Rui Barradas wrote: > > > >> Hello, > >> > >> There's at least one example where only the form attr(x, "foo") <- "bar" > >> would work, not the other form. If you want to set attributes > >> programatically, use the first form, like in the function below. Note > >> that the example is artificial. > >> > >> > >> setAttr <- function(x, attrib, value){ > >> attr(x, attrib) <- value > >> x > >> } > >> > >> x <- 1:4 > >> setAttr(x, "foo", "bar") > >> > >> > >> You cannot make > >> > >> attribute(x)$attrib <- value > >> > > > > But > > > > attributes(x)[[attrib]] <- value > > > > would be fine. I don't know why Murat thought there would be different > > consistency checks; I'd assume the main difference would be that attr() > > would be quicker. (It does a lot less: attributes(x)[[attrib]] <- value > > essentially does > > > > temp <- attributes(x) > > temp[[attrib]] <- value > > attributes(x) <- temp > > > > and there are a lot of wasted operations there.) > > > > Duncan Murdoch > > > > > > > >> > >> Hope this helps, > >> > >> Rui Barradas > >> > >> Em 09-05-2013 18:35, Murat Tasan escreveu: > >> > hi all -- i looked through the R Language Definition document, but > >> couldn't > >> > find any particular warning or example that would clarify the best use > >> of > >> > attribute setting for R objects. > >> > > >> > let x be some R object, and i'd like to add attribute "foo" with value > >> > "bar". > >> > > >> > case 1: > >> >> attr(x, "foo") <- "bar" > >> > > >> > case 2: > >> >> attributes(x)$foo <- "bar" > >> > > >> > in both cases, attributes(x) reveals the appropriate setting has taken > >> > place. > >> > i'm assuming that attr(...) is 'safer' in the sense that perhaps > >> > consistency checks are made? > >> > (almost like a generic accessor/setter method?) > >> > but i also haven't seen any examples where case 2 (above) would bad... > >> is > >> > there are trivial such example out there? > >> > > >> > BTW -- the cause for interest here is when dealing with dendrogram > >> objects, > >> > for which much of the useful data are stored as attributes, and where > >> > running dendrapply means having to explicitly set attribute values to > >> > retain the tree structure in the resulting object. > >> > > >> > cheers, > >> > > >> > -m > >> > > >> > [[alternative HTML version deleted]] > >> > > >> > ______________________________**________________ > >> > R-help@r-project.org<mailto:R-help@r-project.org> mailing list > >> > https://stat.ethz.ch/mailman/**listinfo/r- > help<https://stat.ethz.ch/mailman/listinfo/r-help> > >> > PLEASE do read the posting guide http://www.R-project.org/** > >> posting-guide.html <http://www.R-project.org/posting-guide.html> > >> > and provide commented, minimal, self-contained, reproducible code. > >> > > >> > >> ______________________________**________________ > >> R-help@r-project.org<mailto:R-help@r-project.org> mailing list > >> https://stat.ethz.ch/mailman/**listinfo/r- > help<https://stat.ethz.ch/mailman/listinfo/r-help> > >> PLEASE do read the posting guide http://www.R-project.org/** > >> posting-guide.html <http://www.R-project.org/posting-guide.html> > >> and provide commented, minimal, self-contained, reproducible code. > >> > > > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@r-project.org<mailto:R-help@r-project.org> mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.