To: Martin Maechler <maechler@stat.math.ethz.ch> Subject: Re: R-beta: 'all.names' function -- failing as.list( _function_ ) From: Douglas Bates <bates@stat.wisc.edu> Date: 28 Apr 1997 13:29:02 -0500 In-Reply-To: Martin Maechler's message of Mon, 28 Apr 97 17:07:05 +0200 Martin Maechler <maechler@stat.math.ethz.ch> writes: > your 'all.names' function > [wow, I didn't even know it in S..] > seems to have been written with S in your mind; Actually it was written for a specific purpose where we were examining some formulas. I was not thinking of applying it to functions when I wrote it. It is genuine R rather than S. I compare the mode to "symbol" rather than to "name". > you are exactly demonstrating some of the 'fine' differences between R & S > > >1> all.names <- function (x) > >2> { > >3> if (mode(x) == "symbol") return(as.character(x)) > >4> if (length(x) == 0) return(NULL) > >5> if (is.recursive(x)) return(unlist(lapply(as.list(x), all.names))) > >6> character(0) > >7> } > > 1) length(x) is not always defined in R; e.g. it is NOT for functions. > --> Delete line 4 It does inhibit portability of code that length(object) sometimes produces NA in R. At present the length of a symbol also is NA. That is why the test for mode of "symbol" occurs before the test for zero length. Ross has indicated that he will change that result in a future release. I agree that line 4 is superfluous in the current version. In earlier versions I was doing the recursion a bit differently so I needed a check for zero length in there. > 2) functions are NOT lists and cannot be coerced to, > which makes line 5 fail for function objects. Right O. I don't know how to handle that either. Some of the "eternal truths" about the S language are: - every object has a mode obtainable by mode(object) - every object has a length obtainable by length(object) - every object can be coerced to a list of the same length One can imagine that code that messes around with functions and other expressions in R will break fairly quickly when these conditions do not hold. I don't know how much work would be involved in patching over these differences between R and S but I suspect it would not be a trivial undertaking. There is an important omission in the current version of all.names. Line 5 in your numbering should read if (is.recursive(x)) return(unique(unlist(lapply(as.list(x), all.names)))) Otherwise a large expression will produce a lot of duplicates. -- Douglas Bates bates@stat.wisc.edu Statistics Department 608/262-2598 University of Wisconsin - Madison http://www.stat.wisc.edu/~bates/ =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= r-help 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-help-request@stat.math.ethz.ch =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=