# [R] Equations as arguments to functions

Peter Dalgaard BSA p.dalgaard at biostat.ku.dk
Tue Nov 27 23:39:38 CET 2001

```Michaell Taylor <pols1oh at bestweb.net> writes:

> rm(list=ls())
> increments _ seq(5000,100000,by=5000)
> makeindex <- function(Y,eq) {
> 	losers _ 0; levels_0
> 	index _ 0; location _ 0; cutoff _0; totalapt_0; houses_0
> 	for (C in city[1:2]) {
> 		counter _ 0
> 		if (file.exists(paste("datasets/2000income/",C,sep=""))) {
> 			counter _ counter+1}
> 		if (file.exists(paste("datasets/rents/2000",toupper(C),sep=""))) {
> 			counter _ counter+1}
> 	        if (counter== 2) {
> 			totrent _ 0
> 			totrent _ rep(rent,units)
> 			totrent _ totrent[!is.na(totrent)]
> 			income2000 _ sort(income2000)
> 			print(C)
> 			print(length(income2000))  # for debugging   - notice this works fine
> 			print(ls())                 # for debugging    - notice this works fine
> 			level _ eq		 # FAILURE POINT

[snip]

> makeindex(.35,eq=(income2000[.33*length(income2000)]))
...

> This smells like a "I am an idiot" sort of problem.  I must be missing
> something simple.

Yes. Arguments are evaluated *in the caller environment*. If you type

base <- 2
log(base)

then you don't get log(exp(1)) even though the log function has a
local variable called base.

I assume that income2000 is defined by the load(...) constructs, and
thus are only available in the evaluation environment of the function.

If you really want to pass an expression to be evaluated internally in
the function, try

level <- eval(eq)

and call it with an explicitly quoted argument, like this

makeindex(.35,eq=quote(income2000[.33*length(income2000)]))

--
O__  ---- Peter Dalgaard             Blegdamsvej 3
c/ /'_ --- Dept. of Biostatistics     2200 Cph. N
(*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

```