[Rd] Problem with hasArg and the ... argument (PR#7027)
Peter Dalgaard
p.dalgaard at biostat.ku.dk
Tue Jun 29 17:21:02 CEST 2004
John Chambers <jmc at research.bell-labs.com> writes:
> > and sys.function is documented with argument 'n', which we'd have to
> > change to 'which', but the default is n=0 for "current function" which
> > is unlike 'which' which has 0 meaning .GlobalEnv. Argh...
> >
> > My take is that we need to fix sys.function to behave according to
> > docs, change what we can in the R internals, and face the consequences
> > for package maintainers.
>
> Things are actually messier, even.
>
> 1. A counter-argument for changing the documentation might be that the
> green book (p 106) and S-Plus take the argument to be the frame number
> (only sys.parent(n) uses the argument for the number of frames back).
>
> Unfortunately for the counter-argument, the (current) R implementation
> and the S-Plus implementation differ in where they start indexing. In
> S-Plus, 1 is the top-level frame (corresponding to the global
> environment). In R, it is the first function call frame (and 0
> corresponds to the global environment).
>
> So there seems no way to have R/S-Plus compatibility.
>
> 2. And R-only consistency does not look too good either: sys.call() and
> sys.frame() claim to have the which= behavior. It's not very natural
> for sys.function() to behave differently.
>
> And even if that didn't bother us, sys.call(0) returns the current call,
> not the "global call" (whatever that would mean), regardless of
> documentation. (The test at the bottom of this mail illustrates.)
>
> What to do? Well, a tentative suggestion.
> - Leave the implementation almost alone--no simple fix will clean up all
> the problems. Optionally make one change: If sys.frame(0) produced the
> frame of the current call, then sys.function, sys.call, and sys.frame
> would be consistent.
>
> - Change the documentation to give sys.function argument `which',
> explaining that which=0 is interpreted as the current
> call/function/frame.
>
> If we wanted to leave the implementation totally unchanged, then we have
> to admit the inconsistency in sys.frame, and tell people to use
> sys.frame(sys.nframe()) to produce the current frame.
(or environment()!)
Changing the behaviour of sys.frame() would probably mess rather badly
with the sys.frame(sys.parent()) idiom whenever sys.parent() returns
zero (yes I know about parent.frame(), but does everybody else?).
Probably, we should just document what we got, possibly changing the
argument name in sys.function() from n to which. I think we might be
able to explain succinctly that sys.call(0) and sys.function(0) gives
current call and function, since there is no "top level" definitions
of the two.
--
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
More information about the R-devel
mailing list