Re: [R] Existence of formal arguments.

From: Bert Gunter <>
Date: Thu, 05 Jun 2008 21:48:36 -0700


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.

Bert Gunter

-----Original Message-----
From: [] 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()
 > 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 mailing list PLEASE do read the posting guide and provide commented, minimal, self-contained, reproducible code. mailing list PLEASE do read the posting guide and provide commented, minimal, self-contained, reproducible code. Received on Fri 06 Jun 2008 - 04:59:52 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 06 Jun 2008 - 05:30:38 GMT.

Mailing list information is available at Please read the posting guide before posting to the list.

list of date sections of archive