[R] Existence of formal arguments.

Bert Gunter gunter.berton at gene.com
Fri Jun 6 06:48:36 CEST 2008


Folks:

Don't forget about R's lazy evaluation mechanism. In your example below, a
and b are as yet unevaluated promises. As such, they have various
properties, which you can investigate via something like:

foo <- function(a,b){browser()}

In your example, get("a") is an empty promise. For amusement, check its
length (it's 1 !).

As soon as you try to evaluate the promise, e.g. via <- ("assignment"), R
discovers that the promise cannot be evaluated, an so is missing. This then
throws the error. What is surprising to me, however, is that R does not
throw the error at the first assignment, x <- get("a"), but rather when it
tries to evaluate x in the next statement. However, as you said, these are
primitive functions, and we are now deep into the esoterica of the language,
pointers to pointers, pairlists, and so forth, about which I know nothing.

But hopefully this sheds a glimmer of light. You might be able to dig around
in the R language manual and find something there that sheds a bit more.

Cheers,
Bert Gunter

-----Original Message-----
From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On
Behalf Of Charilaos Skiadas
Sent: Thursday, June 05, 2008 9:02 PM
To: Duncan Murdoch
Cc: R-help forum
Subject: Re: [R] Existence of formal arguments.


On Jun 5, 2008, at 9:13 PM, Duncan Murdoch wrote:

> On 05/06/2008 8:23 PM, Rolf Turner wrote:
>> I just discovered what seems to me to be a slight funny in respect
>> of formal argument names.  If I define a function
>> 	foo <- function(a,b){ ... whatever ...}
>> then ``inside'' foo() the exists() function will return TRUE
>> from ``exists("a") whether an object named ``a'' exists or not.
>> But get("a") will yield an error ``object "a" not found''
>> in these circumstances.
>> I presume there is a reason for specifying that an object named
>> by a formal argument always exists --- but it is mysterious by my
>> standards.  Can anyone explain the reason for this behaviour?
>
> Oops, I didn't explain why this is the way it should be.
>
> Say your "whatever" above makes use of a, but you didn't pass an a  
> in. Then you'd like an error, or you'd like "missing(a)" to  
> evaluate to TRUE, or something along those lines.  But if a was  
> completely undefined and nonexistent, R would just go looking for a  
> global, and make use of that.  So it has to be marked as missing.

I am now baffled by this:

 > foo <- function(a,b){class(get("a"))}
 > foo()
[1] "name"

 > foo <- function(a,b){x<-get("a");class(x)}
 > foo()
Error in foo() : argument "x" is missing, with no default

And similarly with str:

 > foo <- function(a,b){str(get("a"))}
 > foo()
symbol
 > foo <- function(a,b){x<-get("a");str(x)}
 > foo()
Error in str(x) : argument "x" is missing, with no default


Well OK, maybe not baffled exactly, it short of fits with your  
description above. I guess I am wondering, how is this technically  
achieved?
I suppose then that missing(a) the only call we should expect to work  
in the absence of a, even though calls like class(get("a")) and str 
(get("a")), is.numeric(get("a")) etc seem to return something  
reasonable?

> Duncan Murdoch

Haris Skiadas
Department of Mathematics and Computer Science
Hanover College

______________________________________________
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