[R] Executing a Function in a Loop With a ChangingValue foran Argument

Bill.Venables at csiro.au Bill.Venables at csiro.au
Thu Oct 25 08:26:22 CEST 2007


I wondered if the real problem was bigger than your abstract version.
OK.  Here is one way to do it

> myfunc <- function(x) {
    nam <- deparse(substitute(x))
    val <- mean(x)
    cat("mean(", nam, ") =", val, "\n")
    invisible(val)
    }
> ex <- quote(myfunc(x))
> subst <- function(Command, ...) do.call("substitute", list(Command,
list(...)))
> dat <- data.frame(matrix(rnorm(25), 5, 5))
> vars <- names(dat)[-1]
> vars
[1] "X2" "X3" "X4" "X5"
> for(i in vars) with(dat, eval(subst(ex, x = as.symbol(i))))
mean( X2 ) = -0.08661249 
mean( X3 ) = 0.009840606 
mean( X4 ) = -0.21054 
mean( X5 ) = 0.07321301 
> colMeans(dat[, -1])
          X2           X3           X4           X5 
-0.086612490  0.009840606 -0.210540008  0.073213012 
> 

Now why do I suspect there is something more as well....hmmm...? 


Bill Venables
CSIRO Laboratories
PO Box 120, Cleveland, 4163
AUSTRALIA
Office Phone (email preferred): +61 7 3826 7251
Fax (if absolutely necessary):  +61 7 3826 7304
Mobile:                         +61 4 8819 4402
Home Phone:                     +61 7 3286 7700
mailto:Bill.Venables at csiro.au
http://www.cmis.csiro.au/bill.venables/ 

-----Original Message-----
From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org]
On Behalf Of Rick Bilonick
Sent: Thursday, 25 October 2007 4:13 PM
To: R Help
Subject: Re: [R] Executing a Function in a Loop With a ChangingValue
foran Argument

On Thu, 2007-10-25 at 15:34 +1000, Bill.Venables at csiro.au wrote:
> There are many simple ways to do this, if I understand you correctly.
> Here is an example
> 
> > dat <- data.frame(matrix(rnorm(25), 5, 5))
> > names(dat)
> [1] "X1" "X2" "X3" "X4" "X5"
> > vars <- names(dat)[-1]
> > vars
> [1] "X2" "X3" "X4" "X5"
> > myfunc <- function(x) print(mean(x))
> > for(i in dat[, vars]) myfunc(x = i)
> [1] 0.3648022
> [1] -0.1593466
> [1] 0.5874517
> [1] -0.5049586
> > colMeans(dat)  ## as a check
>         X1         X2         X3         X4         X5 
>  0.1779146  0.3648022 -0.1593466  0.5874517 -0.5049586 
> > 
> 
> 
> Bill Venables
> 

Thanks. The problem with this approach is that the data.frame variable
names are lost. (A minor point is that it won't work if only one
variable is chosen.) The function I wrote generates labels for a plot
and I want the variable name to show up (not "i"). I was hoping not to
have to re-write my function. Is there a way to pass the variables that
will allow my function to work normally (just as it would if I wrote out
the function calls with the names manually inserted)? (I would assume
that any function that generates a character variable from the variable
name is not going to produce the desired result.)

Rick B.

______________________________________________
R-help at 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.



More information about the R-help mailing list