[Rd] Another wishlist for R
Kevin Wright
kwright at eskimo.com
Fri Jan 16 18:46:40 MET 2004
First, a big thanks to all of the developers and users that have worked to
make R such useful software. It is only because I find the software so useful
that I have the following opinions.
A recent post to R-devel listed the 'Top 10 Features' for one person. I found
it to be quite an interesting read. Over the past couple of years I have
assembled my own lists.
Retrospective. Some of my favorite things I like about R (vs. S-Plus)
1. Integration with emacs
2. Nice color handling
3. Wealth of packages, easy package updates
4. HTML help
5. More answers on R-news than S-help
6. Active developer community
7. Package creation tools
8. Functions: setwd, with, apropos
Prospective. Periodically David Smith at Insightful asks users, "If you had
$100, how would you allocate that money to development?" Without listing
dollar amounts, these are my personal choices for R.
1. Add "head" and "tail" to R base.
Patrick Burns has these: http://www.burns-stat.com/pages/public.html#genutil
Very handy functions for checking data manipulation.
2. Strive for self-contained examples in all .Rd files (as far as possible).
Generally quite good, but there's always room for improvement.
For R base, If I create examples, to whom should I send them (R-devel?) and
how (request for change?).
Here's one example (by P. Dalgaard) for function 'replace'
# Replace in a data frame NA´s with -1?
dd <- data.frame(a=c(1,2,NA,4),b=c(NA,2,3,4))
dd[] <- lapply(dd,function(x) replace(x, is.na(x), -1))
3. Encourage (more) standards for function names.
A prominent link on CRAN to the coding conventions would be good.
Here is a draft of coding conventions:
http://www.maths.lth.se/help/R/RCC/
Partly as a result of the community development of R, the names of
functions lack consistency. Consider the following examples:
row.names, rownames
browseURL, contrib.url, fixup.package.URLs
package.contents, packageStatus
mahalanobis, TukeyHSD
getMethod, getS3method
The sooner that conventions are encouraged, the more consistent future
function names will be.
4. Increased integration of text and graphics output (for PDF, in particular).
Sweave is fantastic for quality reporting, but can be a lot of work
when a quick analysis is all that is needed.
Often I would like to do something like print a box plot and include an
anova table, for example:
pdf("file")
boxplot(y~x)
frame()
sink.to.pdf()
frame()
anova(lm(y~x))
sink()
dev.off()
I know of no such (simple) tools. Ben Bolker has a an idea here:
http://maths.newcastle.edu.au/~rking/R/help/02b/4179.html
5. Drop unused factor levels by default. (At least as a settable option.)
This issue has been debated before--I'm just adding my vote and justification.
The proportion of time I want data to include unused factor levels is close
to zero. The amount of time I spend cleaning data to get rid of unused
factor levels is quite substantial.
6. Expanded font control for graphics devices.
This is already being considered, so again I'm just adding my vote. See:
http://www.stat.auckland.ac.nz/~paul/R/fonts.html
7. Clean up namespace implementation
The introduction of namespaces has (for me) been a nuisance without
any benefits that I am aware of. I speak as a user, not a package maintainer.
I would like to see (1) more education about namespace benefits, (2) more
discussions about what is the appropriate role for namespaces and (3)
improvements to the documentation, which is now often less correct (if not
broken) due to namespaces. For example, help(is.function) doesn't say how
functions hidden behind namespaces will be treated. Most help files
completely ignore issues with namespaces.
Some people will say, "of course namespaces are working exactly as
expected"! But that is only true if you expect functions to be
hidden...quite a few versions of R trained users otherwise.
The quiet introduction of namespaces has broken my modus operandi for:
args(predict.lme)
is.function(predict.lme)
predict.lme(object)
exists("predict.lme")
Namespaces may be neat/right from a language-design perspective, but have
made it more frustrating for me to actually use the software.
8. More consistency in the use of na.action and na.rm.
Compare: mean(..., na.rm= ...) lme(..., na.action=... )
Maybe na.action could be added to 'mean' and other functions.
There are issues of compatability with S-Plus here...
9. Add 'substitute' to getAnywhere
Acutally, the code for getAnywhere already contains 'substitute', so it
looks like the author intended for the function to work without a quoted
argument. That would be wonderful. Then why does
getAnywhere("predict.lme") work but getAnywhere(predict.lme) does not work?
(Yet another namespace issue)
I'm not the first person to ask this question. Obviously I'm
a member of the "blind" population that can't read help files:
http://maths.newcastle.edu.au/~rking/R/help/03b/0760.html
Another possibility is that the help file could be clearer for us blind
folk that interpret "x: a character string or name" to mean that
x might not be a character string. (See the help page)
10. More uniformity in quoting arguments.
Uniformity outweighs cleverness/exceptions ("The Art of Unix Programming").
Functions accepting non-quoted arguments
is.function(obj)
args(predict)
rm(a)
help(help)
find(replace) or find("replace")
Functions requiring quoted arguments
get("help")
exists("predict.lme")
Some people have claimed "the designers of S knew what they were
doing" because you can do clever things like this:
i="help"
exists(i)
But we could just as easily be doing other clever things
and have more uniform quoting rules. S is probably too mature for this to
really be considered.
11. Have 'aggregate' add logical/default names to its value.
I'm basically echoing this thread:
http://maths.newcastle.edu.au/~rking/R/help/03b/7517.html
Using aggregate(x,by,FUN), I would find it very useful if the factor names in
the "by" list carried through to the final aggregate data.frame. Also,
when 'x' is a vector (and maybe for other data structures), it would be
nice to have the original names included in the result.
12. Wanted: General-purpose mixed-models function/package
The nlme library is very nice for mixed-effects models with nested
effects, but it is not very general-purpose. Even Bates/Pinheiro have said
several times in posts to R-help/S-news that nlme was designed for nested
models and using other models can be hard.
Bates: "highly unintuitive" (crossed effects model)
Bates: "algorithms for lme are tuned for nested random effects"
For example, in nlme,
The syntax for crossed random effects is quite intimidating
Try removing the variance component for Rep in: random=~1|Rep/WholePlot.
Try changing an nested effect from random to fixed (or vice-versa).
Try to extract lsmeans for fixed-effects in a model.
Try to do a multiple-comparison of fixed-effects estimates.
Try using AR1xAR1 error structure. The nlme library appears to have
tools for this, but again is syntactically difficult. I can find no
examples.
Most of these tasks would ideally be straightforward in a general-purpose
mixed-models function (as they are in SAS, Genstat, etc.)
The ASREML software is available in S-Plus (and soon R, I'm told) via
the proprietary 'samm' library. Whereas lme seems excellent for basic
nested-effects models and difficult for other models, samm excels at
crossed-effects models, but doesn't have the plethora of useful
print, plot, extractor, and summary methods that are found in nlme.
13. The fantasy list. Go ahead and tell me, "In your dreams!"
Deprecate 'update'. Cute, but makes session transcripts hard to read.
Remove implicit intercepts in models. Require y~1+x. Force thinking about intercepts.
Lattice colors could be more saturated for printing and projecting
Rename 'prompt' to something closer to its purpose like makeSkeletonHelp
The humble opinion of one devoted user,
Kevin Wright
More information about the R-devel
mailing list