R-alpha: Playing the tag game

Ross Ihaka ihaka@stat.auckland.ac.nz
Mon, 21 Apr 1997 08:43:35 +1200 (NZST)


	Here are a handful of oddities in pre0.50-7 (at some risk of reprisals
	from people waiting for the real 0.50...):

I don't know that these will even be looked at before 0.49 :-) comes
out.  I'm checking portabity and configuration at present.  It would
be REALLY nice if commercial vendors could stick to the standards
(ANSI, POSIX ...) as well as the free software developers do.

	I was mucking about trying to figure out how to know which tags has
	been used in a function call, and some weird stuff happened.

	----------
	A call with tagged arguments is something like a list, the tags
	can be used to access elements, but the names attribute is absent,
	until the call is coerced to a list. (Attempting to set the names()
	causes evaluation. Changing "list" to "blipblop" causes an 'Error:
	couldn't find function "blipblop"' at that point.)

	> j<-substitute(list(a=1,b=2))
	> j
	list(a = 1, b = 2)
	> j$b
	[1] 2
	> names(j)
	NULL
	> names(j)<-NULL
	> j
	[[1]]
	[1] 1

	[[2]]
	[1] 2

This is an oversight, and should have a one line fix (add extra cases
to an existing switch).

	[Previously saved workspace restored]

	> j<-as.call(list(a=1,b=2))
	> j
	Segmentation fault (core dumped)
	------------
	Strange... as.call should return its argument if is.call is true?

	> j<-substitute(list(a=1,b=2))
	> j
	list(a = 1, b = 2)
	> as.call(j)
	Error in as.call(j) : invalid argument list
	> is.call(j)
	[1] TRUE

"as.call" is pretty new and unexercised.

	Ok, the right solution seems to be names(as.list(j)), but then we run
	into some other fun with NA's... Shouldn't the real NA print without
	quotes?

	> ch[1]<-paste("N","A",sep="") 
	> is.na(ch)
	[1] FALSE FALSE FALSE
	> ch
	[1] "NA" "a"  "b" 
	> ch[1]=="NA"
	[1] TRUE
	> ch[1]<-"NA"                 
	> is.na(ch)
	[1]  TRUE FALSE FALSE
	> 

You naughty boy! :-)  I've have always thought that using "NA" to
indicate a missing string value was asking for problems.  What happens
when some poor unsuspecting user starts abbreviating "North America"
for example.

We use a bottleneck at string creation time to check whether the string
being stored is "NA".  If it is, we return the address of a special
unique string.  That way we can check for NA by simply doing an address
comparison rather than a string comparison (this is the same trick we
use for comparing variable names).  This doesn't catch "NA" strings
made in the underhand fashion above.

I see a couple of possible solutions.

1.  Remain compatible with S and just unoptimise our detection of
    string NAs.

2.  Be incompatible with S and introduce a real NA for strings.
    This would print as NA rather than "NA".  I like this second
    solution, but its does violate the "prime directive" (be
    compatible).

Ross
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
r-devel 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-devel-request@stat.math.ethz.ch
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-