On 12/07/2007 7:23 PM, Talbot Katz wrote:> Hi.
>
> I have defined a function, f1, that calls another function, f2. Inside f1
> an intermediate variable called nm1 is created; it is a matrix. f2 takes a
> matrix argument, and I defined f2 (schematically) as follows:
>
> f2<-function(nmArg1=nm1,...){nC<-ncol(nmArg1); ... }
>
> so that it expects nm1 as the default value of its argument. f1 is defined
> (schematically) as:
>
> f1<-function(...){result1<-f2(); ... }
>
> When I ran f1 I got the following error message:
>
> Error in ncol(nmArg1) : object "nm1" not found.
>
> If I redefine f1 schematically as:
>
> f1<-function(...){result1<-f2(nmArg1=nm1); ... }
>
> it runs okay. If I have nm1 defined outside of f1 and I run
"result1<-f2()"
> it also runs okay. So f2 doesn't seem to pick up the default argument
value
> inside the function f1, even when the default argument is defined inside
f1.
> Is there a way to have the subfunction default arguments recognized
inside
> of a function (perhaps a better protocol for using defaults than what I
> did?), or do I just have to spell them out explicitly?
Defaults to arguments are evaluated in the evaluation frame of the
function being called, f2 in your case. Since nm1 is meaningless within
f2, you get the error.
If you want nm1 to be meaningful within f2, you could define f2 within
f1, e.g.
f1<-function(...){
nm1 <- something
f2 <- function (...) {}
result1<-f2(nmArg1=nm1)
...
}
(which is the best way to do it), or you could explicitly manipulate the
environment of f2 (which is an ugly way), or you could store nm1 in some
place that's visible to both f1 and f2 and use <<- when you set it
from
within f1 (another ugly way, but sometimes less ugly than my second
suggestion).
Duncan Murdoch