[R] Splitting vector into individual elements

Gabor Grothendieck ggrothendieck at myway.com
Thu Sep 16 00:10:20 CEST 2004


Paul Roebuck <roebuck <at> odin.mdacc.tmc.edu> writes:

: 
: On Wed, 15 Sep 2004, Peter Dalgaard wrote:
: 
: > Paul Roebuck <roebuck <at> odin.mdacc.tmc.edu> writes:
: >
: > > Is there a means to split a vector into its individual
: > > elements without going the brute-force route for arguments
: > > to a predefined function call?
: > >
: > >     offred.rgb <- c(1, 0, 0) * 0.60;
: > >
: > >     ## Brute force style
: > >     offred.col <- rgb(offred.rgb[1],
: > >                       offred.rgb[2],
: > >                       offred.rgb[3],
: > >                       names = "offred")
: > >     ## Desired style
: > >     offred.col <- rgb(silver.bullet(offred.rgb),
: > >                       names = "offred")
: >
: > The closest is probably this:
: >
: > offred.col <- do.call("rgb", c(as.list(offred.rgb),
: >                                list(names="offred")))
: >
: 
: Everyone offered 'do.call' as the solution. While that
: works, is it to say that there is no means of expanding
: the expression as an argument to the original function?

This is not a true answer to the question of expanding a list
into arguments without using do.call but it does allow you to 
carry out either syntax in this particular case using S3
dispatch:

R> silver.bullet <- as.list
R> rgb <- function(x, ...) UseMethod("rgb")
R> rgb.list <- function(x, ...) rgb(x[[1]],x[[2]],x[[3]],...)
R> rgb.default <- graphics::rgb

R> offred.rgb <- c(1, 0, 0) * 0.60;
R> # original syntax
R> rgb(offred.rgb[1], offred.rgb[2], offred.rgb[3], names = "offred")
   offred 
"#990000" 
R> # list syntax
R> rgb(silver.bullet(offred.rgb), names = "offred")
   offred 
"#990000"




More information about the R-help mailing list