[Rd] Several R vs S-Plus issues (PR#1110)
brahm@alum.mit.edu
brahm@alum.mit.edu
Wed, 3 Oct 2001 17:39:21 +0200 (MET DST)
Hi, all,
I've been converting code from S-Plus ("S" for short) to R for a few weeks.
Here are some differences I've found, aside from the big well-known ones
(scoping, models, data storage) and the contents of Kurt Hornik's FAQ section
3.3.3. Let me start with the ones that seem like serious bugs or deficiencies:
1) LETTERS[c(NA,2)] in S is c("","B"), but in R is c("NA","B").
This is TERRIBLE! I have a ton of S-Plus code that looks like:
y$ticker <- z$ticker[match(y$cusip, z$cusip)]
and I count on a ticker of "" to indicate failed lookups. Not only will
I need to change all that code, but I'll never be able to trade Nabisco
(ticker NA) again. PLEASE re-consider this choice, or at least make it
an option: option(na.char="").
2) system() has no "input" argument in R.
Here's a (Unix) example:
S> system("cd mydir; latex myfile", input="x")
which goes to the directory where myfile lives and LaTeX's it, passing
an "x" through STDIN in case LaTeX encounters an error. My R fix is:
R> system("cd mydir; echo x | latex myfile")
Note that it's not as simple as cmd <- paste("echo",input,"|",cmd).
3) R> myfun <- function(x, ...) {x[...] <- 0; x}
R> myfun(3)
Error in myfun(3) : SubAssignArgs: invalid number of arguments
It failed because no ... was given. Fortunately, this is easily patched:
R> myfun <- function(x, ...) {if (missing(...)) x[]<-0 else x[...]<-0; x}
4) Missing functions:
a) identical() [scheduled for 1.4.0]
b) slice.index()
c) rowSums(), colSums(), colVars(), etc.
d) unpaste() - R has strsplit, whose result is like the transpose of unpaste
5) rowsum() gives character dimnames in S, factor numbers in R.
I've reported this early, and Brian D. Ripley promised a fix in 1.4.0.
OK, the rest are just differences, not complaints. In fact, sometimes they are
very good differences.
1) Same argument given twice produces an error in R; S takes the last one.
S> mean(x=4, x=5) # Returns 5
R> mean(x=4, x=5) # Error
2) row.names(y) <- LETTERS[1:3] coerces list to dataframe in S, is error in R.
3) Default "what" for scan in S is "", in R is double(0).
4) Default "quote" for scan is "'\"" in R, causes different behavior than S.
5) which(<numeric>) converts to logical in S, is an error in R.
6) The NULL returned by if(F){...} is invisible in R, visible in S.
7) The NULL returned by return() is visible in R, invisible in S.
8) Args to "var" differ, and R has "cov". S na.method="a" is like R use="p".
9) var (or cov) drops dimensions in S, not R.
10) cut allows labels=F in R, not in S (also left.include=T becomes right=F).
11) substring(s,"x") <- "X" only works in S, but R has s <- gsub("x","X",s).
12) S function casefold() replaced in R by toupper() or tolower().
13) Functions missing from S: sub(), gsub(), chartr(), toupper(), tolower()
14) Log scale indicated in S with par(xaxt)=="l", in R with par("xlog")==T.
-- David Brahm (a215020@agate.fmr.com)
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._