R-Devel: I am trying to get an attribute of the first argument in a call to a function whose formal arguments consist of dots only and do something, e.g., call 'cbind', based on the attribute f<- function(...) {get first attribute; maybe or maybe not call 'cbind'} I thought of (ignoring "deparse.level" for the moment) f<-function(...) {x <- attr(list(...)[[1L]], "foo"); if (x=="bar") cbind(...) else x} but I feared my solution might do some extra copying, with a performance penalty if the dotted objects in the actual call to "f' are very large. I thought the following alternative might avoid a potential performance hit by evaluating the attribute in the parent.frame (and therefore avoid extra copying?): f<-function(...) { L<-match.call(expand.dots=FALSE)[[2L]] x <- eval(substitute(attr(x,"foo"), list(x=L[[1L]]))) if (x=="bar") cbind(...) else x } system.time tests showed this second form to be only marginally faster. Is my fear about extra copying unwarranted? If not, is there a better way to get the "foo" attribute of the first argument other than my two alternatives? Thanks, Dan Murphy [[alternative HTML version deleted]]
Hi Daniel, On 02.07.2010, at 23:26, Daniel Murphy wrote:> I am trying to get an attribute of the first argument in a call to a > function whose formal arguments consist of dots only and do something, e.g., > call 'cbind', based on the attribute > f<- function(...) {get first attribute; maybe or maybe not call 'cbind'} > > I thought of (ignoring "deparse.level" for the moment) > > f<-function(...) {x <- attr(list(...)[[1L]], "foo"); if (x=="bar") > cbind(...) else x}what about using the somewhat obscure ..1 syntax? This version runs quite a bit faster for me: g <- function(...) { x <- attr(..1, "foo") if (x == "bar") cbind(...) else x } but it will be hard to quantify how this pans out for your unless we know how many and what size and type the arguments are. Cheers, Olaf
Hi Daniel, On 02.07.2010, at 23:26, Daniel Murphy wrote:> I am trying to get an attribute of the first argument in a call to a > function whose formal arguments consist of dots only and do something, e.g., > call 'cbind', based on the attribute > f<- function(...) {get first attribute; maybe or maybe not call 'cbind'} > > I thought of (ignoring "deparse.level" for the moment) > > f<-function(...) {x <- attr(list(...)[[1L]], "foo"); if (x=="bar") > cbind(...) else x}what about using the somewhat obscure ..1 syntax? This version runs quite a bit faster for me: g <- function(...) { x <- attr(..1, "foo") if (x == "bar") cbind(...) else x } but it will be hard to quantify how this pans out for your unless we know how many and what size and type the arguments are. Cheers, Olaf
Hi Dan, Is there a reason you can't change the function to f <- function(x, ...) {} ? Hadley On Fri, Jul 2, 2010 at 4:26 PM, Daniel Murphy <chiefmurphy at gmail.com> wrote:> R-Devel: > > I am trying to get an attribute of the first argument in a call to a > function whose formal arguments consist of dots only and do something, e.g., > call 'cbind', based on the attribute > f<- function(...) {get first attribute; maybe or maybe not call 'cbind'} > > I thought of (ignoring "deparse.level" for the moment) > > f<-function(...) {x <- attr(list(...)[[1L]], "foo"); if (x=="bar") > cbind(...) else x} > > but I feared my solution might do some extra copying, with a performance > penalty if the dotted objects in the actual call to "f' are very large. > > I thought the following alternative might avoid a potential performance hit > by evaluating the attribute in the parent.frame (and therefore avoid extra > copying?): > > f<-function(...) > { > ? L<-match.call(expand.dots=FALSE)[[2L]] > ? x <- eval(substitute(attr(x,"foo"), list(x=L[[1L]]))) > ? if (x=="bar") cbind(...) else x > } > > system.time tests showed this second form to be only marginally faster. > > Is my fear about extra copying unwarranted? If not, is there a better way to > get the "foo" attribute of the first argument other than my two > alternatives? > > Thanks, > Dan Murphy > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- Assistant Professor / Dobelman Family Junior Chair Department of Statistics / Rice University http://had.co.nz/