[Rd] question
Wacek Kusnierczyk
Waclaw.Marcin.Kusnierczyk at idi.ntnu.no
Sat Mar 7 10:34:31 CET 2009
Mark.Bravington at csiro.au wrote:
>
>> The syntax for returning multiple arguments does not strike me as
>> particularly appealing. would it not possible to allow syntax like:
>>
>> f= function() { return( rnorm(10), rnorm(20) ) }
>> (a,d$b) = f()
>>
>>
>
>
> FWIW, my own solution is to define a "multi-assign operator":
>
> '%<-%' <- function( a, b){
> # a must be of the form '{thing1;thing2;...}'
> a <- as.list( substitute( a))[-1]
> e <- sys.parent()
> stopifnot( length( b) == length( a))
> for( i in seq_along( a))
> eval( call( '<-', a[[ i]], b[[i]]), envir=e)
> NULL
> }
>
you might want to have the check less stringent, so that rhs may consist
of more values that the lhs has variables. or even skip the check and
assign NULL to a[i] for i > length(b). another idea is to allow %<-% to
be used with just one variable on the lhs.
here's a modified version:
'%<-%' <- function(a, b){
a <- as.list( substitute(a))
if (length(a) > 1)
a <- a[-1]
if (length(a) > length(b))
b <- c(b, rep(list(NULL), length(a) - length(b)))
e <- sys.parent()
for( i in seq_along( a))
eval( call( '<-', a[[ i]], b[[i]]), envir=e)
NULL }
{a; b} %<-% 1:2
# a = 1; b = 2
a %<-% 3:4
# a = 3
{a; b} %<-% 5
# a = 5; b = NULL
vQ
More information about the R-devel
mailing list