Rev 78232 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
## Regression tests for which the printed output is the issue### _and_ must work (no Recommended packages, please)pdf("reg-tests-2.pdf", encoding = "ISOLatin1.enc")## force standard handling for data framesoptions(stringsAsFactors=FALSE) # R >= 4.0.0options(useFancyQuotes=FALSE)### moved from various .Rd files## abbreviatefor(m in 1:5) {cat("\n",m,":\n")print(as.vector(abbreviate(state.name, minl=m)))}## applyx <- cbind(x1 = 3, x2 = c(4:1, 2:5))dimnames(x)[[1]] <- letters[1:8]apply(x, 2, summary) # 6 x n matrixapply(x, 1, quantile)# 5 x n matrixd.arr <- 2:5arr <- array(1:prod(d.arr), d.arr,list(NULL,letters[1:d.arr[2]],NULL,paste("V",4+1:d.arr[4],sep="")))aa <- array(1:20,c(2,2,5))str(apply(aa[FALSE,,,drop=FALSE], 1, dim))# empty integer, `incorrect' dim.stopifnot(apply(arr, 1:2, sum) == t(apply(arr, 2:1, sum)),aa == apply(aa,2:3,function(x) x),all.equal(apply(apply(aa,2:3, sum),2,sum),10+16*0:4, tolerance = 4*.Machine$double.eps))marg <- list(1:2, 2:3, c(2,4), c(1,3), 2:4, 1:3, 1:4)for(m in marg) print(apply(arr, print(m), sum))for(m in marg) ## 75% of the time here was spent on the namesprint(dim(apply(arr, print(m), quantile, names=FALSE)) == c(5,d.arr[m]))## Besselnus <- c(0:5,10,20)x0 <- 2^(-20:10)plot(x0,x0, log='xy', ylab="", ylim=c(.1,1e60),type='n',main = "Bessel Functions -Y_nu(x) near 0\n log - log scale")for(nu in sort(c(nus,nus+.5))) lines(x0, -besselY(x0,nu=nu), col = nu+2)legend(3,1e50, leg=paste("nu=", paste(nus,nus+.5, sep=",")), col=nus+2, lwd=1)x <- seq(3,500);yl <- c(-.3, .2)plot(x,x, ylim = yl, ylab="",type='n', main = "Bessel Functions Y_nu(x)")for(nu in nus){xx <- x[x > .6*nu]; lines(xx,besselY(xx,nu=nu), col = nu+2)}legend(300,-.08, leg=paste("nu=",nus), col = nus+2, lwd=1)x <- seq(10,50000,by=10);yl <- c(-.1, .1)plot(x,x, ylim = yl, ylab="",type='n', main = "Bessel Functions Y_nu(x)")for(nu in nus){xx <- x[x > .6*nu]; lines(xx,besselY(xx,nu=nu), col = nu+2)}summary(bY <- besselY(2,nu = nu <- seq(0,100,len=501)))which(bY >= 0)summary(bY <- besselY(2,nu = nu <- seq(3,300,len=51)))summary(bI <- besselI(x = x <- 10:700, 1))## end of moved from Bessel.Rd## data.frameset.seed(123)L3 <- LETTERS[1:3]d <- data.frame(cbind(x=1, y=1:10), fac = sample(L3, 10, replace=TRUE),stringsAsFactors=TRUE)str(d)(d0 <- d[, FALSE]) # NULL dataframe with 10 rows(d.0 <- d[FALSE, ]) # <0 rows> dataframe (3 cols)(d00 <- d0[FALSE,]) # NULL dataframe with 0 rowsstopifnot(identical(d, cbind(d, d0)),identical(d, cbind(d0, d)))stopifnot(identical(d, rbind(d,d.0)),identical(d, rbind(d.0,d)),identical(d, rbind(d00,d)),identical(d, rbind(d,d00)))## Comments: failed before ver. 1.4.0## diagdiag(array(1:4, dim=5))## test behaviour with 0 rows or columnsdiag(0)z <- matrix(0, 0, 4)diag(z)diag(z) <- numeric(0)z## end of moved from diag.Rd## format## handling of quoteszz <- data.frame(a=I("abc"), b=I("def\"gh"))format(zz)## " (E fontification)## printing more than 16 is platform-dependentfor(i in c(1:5,10,15,16)) cat(i,":\t",format(pi,digits=i),"\n")p <- c(47,13,2,.1,.023,.0045, 1e-100)/1000format.pval(p)format.pval(p / 0.9)format.pval(p / 0.9, dig=3)## end of moved from format.Rd## is.finitex <- c(100,-1e-13,Inf,-Inf, NaN, pi, NA)x # 1.000000 -3.000000 Inf -Inf NA 3.141593 NAnames(x) <- formatC(x, dig=3)is.finite(x)##- 100 -1e-13 Inf -Inf NaN 3.14 NA##- T T . . . T .is.na(x)##- 100 -1e-13 Inf -Inf NaN 3.14 NA##- . . . . T . Twhich(is.na(x) & !is.nan(x))# only 'NA': 7is.na(x) | is.finite(x)##- 100 -1e-13 Inf -Inf NaN 3.14 NA##- T T . . T T Tis.infinite(x)##- 100 -1e-13 Inf -Inf NaN 3.14 NA##- . . T T . . .##-- either finite or infinite or NA:all(is.na(x) != is.finite(x) | is.infinite(x)) # TRUEall(is.nan(x) != is.finite(x) | is.infinite(x)) # FALSE: have 'real' NA##--- Integer(ix <- structure(as.integer(x),names= names(x)))##- 100 -1e-13 Inf -Inf NaN 3.14 NA##- 100 0 NA NA NA 3 NAall(is.na(ix) != is.finite(ix) | is.infinite(ix)) # TRUE (still)storage.mode(ii <- -3:5)storage.mode(zm <- outer(ii,ii, FUN="*"))# integerstorage.mode(zd <- outer(ii,ii, FUN="/"))# doublerange(zd, na.rm=TRUE)# -Inf Infzd[,ii==0](storage.mode(print(1:1 / 0:0)))# Inf "double"(storage.mode(print(1:1 / 1:1)))# 1 "double"(storage.mode(print(1:1 + 1:1)))# 2 "integer"(storage.mode(print(2:2 * 2:2)))# 4 "integer"## end of moved from is.finite.Rd## kroneckerfred <- matrix(1:12, 3, 4, dimnames=list(LETTERS[1:3], LETTERS[4:7]))bill <- c("happy" = 100, "sad" = 1000)kronecker(fred, bill, make.dimnames = TRUE)bill <- outer(bill, c("cat"=3, "dog"=4))kronecker(fred, bill, make.dimnames = TRUE)# dimnames are hard work: let's test them thoroughlydimnames(bill) <- NULLkronecker(fred, bill, make=TRUE)kronecker(bill, fred, make=TRUE)dim(bill) <- c(2, 2, 1)dimnames(bill) <- list(c("happy", "sad"), NULL, "")kronecker(fred, bill, make=TRUE)bill <- array(1:24, c(3, 4, 2))dimnames(bill) <- list(NULL, NULL, c("happy", "sad"))kronecker(bill, fred, make=TRUE)kronecker(fred, bill, make=TRUE)fred <- outer(fred, c("frequentist"=4, "bayesian"=4000))kronecker(fred, bill, make=TRUE)## end of moved from kronecker.Rd## mergeauthors <- data.frame(surname = c("Tukey", "Venables", "Tierney", "Ripley", "McNeil"),nationality = c("US", "Australia", "US", "UK", "Australia"),deceased = c("yes", rep("no", 4)), stringsAsFactors=TRUE)books <- data.frame(name = c("Tukey", "Venables", "Tierney","Ripley", "Ripley", "McNeil", "R Core"),title = c("Exploratory Data Analysis","Modern Applied Statistics ...","LISP-STAT","Spatial Statistics", "Stochastic Simulation","Interactive Data Analysis","An Introduction to R"),other.author = c(NA, "Ripley", NA, NA, NA, NA,"Venables & Smith"),stringsAsFactors=TRUE)b2 <- books; names(b2)[1] <- names(authors)[1]merge(authors, b2, all.x = TRUE)merge(authors, b2, all.y = TRUE)## empty d.f. :merge(authors, b2[7,])merge(authors, b2[7,], all.y = TRUE)merge(authors, b2[7,], all.x = TRUE)## end of moved from merge.Rd## NAis.na(c(1,NA))is.na(paste(c(1,NA)))is.na(list())# logical(0)ll <- list(pi,"C",NaN,Inf, 1:3, c(0,NA), NA)is.na (ll)lapply(ll, is.nan) # is.nan no longer works on lists## end of moved from NA.Rd## is.na was returning unset values on nested listsll <- list(list(1))for (i in 1:5) print(as.integer(is.na(ll)))## scale## test out NA handlingtm <- matrix(c(2,1,0,1,0,NA,NA,NA,0), nrow=3)scale(tm, , FALSE)scale(tm)## end of moved from scale.Rd## tabulatetabulate(numeric(0))## end of moved from tabulate.Rd## ts# Ensure working arithmetic for 'ts' objects :z <- ts(matrix(1:900, 100, 3), start = c(1961, 1), frequency = 12)stopifnot(z == z)stopifnot(z-z == 0)ts(1:5, start=2, end=4) # truncatets(1:5, start=3, end=17)# repeat## end of moved from ts.Rd### end of moved## PR 715 (Printing list elements w/attributes)##l <- list(a=10)attr(l$a, "xx") <- 23l## Comments:## should print as# $a:# [1] 10# attr($a, "xx"):# [1] 23## On the other handm <- matrix(c(1, 2, 3, 0, 10, NA), 3, 2)na.omit(m)## should print as# [,1] [,2]# [1,] 1 0# [2,] 2 10# attr(,"na.action")# [1] 3# attr(,"na.action")# [1] "omit"## andx <- 1attr(x, "foo") <- list(a="a")x## should print as# [1] 1# attr(,"foo")# attr(,"foo")$a# [1] "a"## PR 746 (printing of lists)##test.list <- list(A = list(formula=Y~X, subset=TRUE),B = list(formula=Y~X, subset=TRUE))test.list## Comments:## should print as# $A# $A$formula# Y ~ X## $A$subset# [1] TRUE### $B# $B$formula# Y ~ X## $B$subset# [1] TRUE## Marc Feldesman 2001-Feb-01. Precision in summary.data.frame & *.matrixsummary(attenu)summary(attenu, digits = 5)summary(data.matrix(attenu), digits = 5)# the same for matrix## Comments:## No difference between these in 1.2.1 and earlierset.seed(1)x <- c(round(runif(10), 2), 10000)summary(x)summary(data.frame(x))## Comments:## All entries show all 3 digits after the decimal point now.## Chong Gu 2001-Feb-16. step on binomialsdetg1 <-structure(list(Temp = structure(c(2L, 1L, 2L, 1L, 2L, 1L, 2L,1L, 2L, 1L, 2L, 1L), .Label = c("High", "Low"), class = "factor"),M.user = structure(c(1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L,1L, 2L, 2L), .Label = c("N", "Y"), class = "factor"),Soft = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L),.Label = c("Hard", "Medium", "Soft"), class = "factor"),M = c(42, 30, 52, 43,50, 23, 55, 47, 53, 27, 49, 29), X = c(68, 42, 37, 24, 66,33, 47, 23, 63, 29, 57, 19)), .Names = c("Temp", "M.user","Soft", "M", "X"), class = "data.frame", row.names = c("1", "3","5", "7", "9", "11", "13", "15", "17", "19", "21", "23"))detg1.m0 <- glm(cbind(X,M)~1,binomial,detg1)detg1.m0step(detg1.m0,scope=list(upper=~M.user*Temp*Soft))## PR 829 (empty values in all.vars)## This example by Uwe Ligges <ligges@statistik.uni-dortmund.de>temp <- matrix(1:4, 2)all.vars(temp ~ 3) # OKall.vars(temp[1, ] ~ 3) # wrong in 1.2.1## 2001-Feb-22 from David Scott.## rank-deficient residuals in a manova model.gofX.df<-structure(list(A = c(0.696706709347165, 0.362357754476673,-0.0291995223012888,0.696706709347165, 0.696706709347165, -0.0291995223012888, 0.696706709347165,-0.0291995223012888, 0.362357754476673, 0.696706709347165, -0.0291995223012888,0.362357754476673, -0.416146836547142, 0.362357754476673, 0.696706709347165,0.696706709347165, 0.362357754476673, -0.416146836547142, -0.0291995223012888,-0.416146836547142, 0.696706709347165, -0.416146836547142, 0.362357754476673,-0.0291995223012888), B = c(0.717356090899523, 0.932039085967226,0.999573603041505, 0.717356090899523, 0.717356090899523, 0.999573603041505,0.717356090899523, 0.999573603041505, 0.932039085967226, 0.717356090899523,0.999573603041505, 0.932039085967226, 0.909297426825682, 0.932039085967226,0.717356090899523, 0.717356090899523, 0.932039085967226, 0.909297426825682,0.999573603041505, 0.909297426825682, 0.717356090899523, 0.909297426825682,0.932039085967226, 0.999573603041505), C = c(-0.0291995223012888,-0.737393715541246, -0.998294775794753, -0.0291995223012888,-0.0291995223012888, -0.998294775794753, -0.0291995223012888,-0.998294775794753, -0.737393715541246, -0.0291995223012888,-0.998294775794753, -0.737393715541246, -0.653643620863612, -0.737393715541246,-0.0291995223012888, -0.0291995223012888, -0.737393715541246,-0.653643620863612, -0.998294775794753, -0.653643620863612,-0.0291995223012888,-0.653643620863612, -0.737393715541246, -0.998294775794753),D = c(0.999573603041505, 0.67546318055115, -0.0583741434275801,0.999573603041505, 0.999573603041505, -0.0583741434275801,0.999573603041505, -0.0583741434275801, 0.67546318055115,0.999573603041505, -0.0583741434275801, 0.67546318055115,-0.756802495307928, 0.67546318055115, 0.999573603041505,0.999573603041505, 0.67546318055115, -0.756802495307928,-0.0583741434275801, -0.756802495307928, 0.999573603041505,-0.756802495307928, 0.67546318055115, -0.0583741434275801), groups = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3), class = "factor", .Label = c("1","2", "3"))), .Names = c("A", "B", "C", "D", "groups"), row.names = 1:24,class = "data.frame")gofX.manova <- manova(formula = cbind(A, B, C, D) ~ groups, data = gofX.df)try(summary(gofX.manova))## should fail with an error message `residuals have rank 3 < 4'## Prior to 1.3.0 dist did not handle missing values, and the## internal C code was incorrectly scaling for missing values.z <- as.matrix(t(trees))z[1,1] <- z[2,2] <- z[3,3] <- z[2,4] <- NAdist(z, method="euclidean")dist(z, method="maximum")dist(z, method="manhattan")dist(z, method="canberra")## F. Tusell 2001-03-07. printing kernels.kernel("daniell", m=5)kernel("modified.daniell", m=5)kernel("daniell", m=c(3,5,7))## fixed by patch from Adrian Trapletti 2001-03-08## Start new year (i.e. line) at Jan:(tt <- ts(1:10, start = c(1920,7), end = c(1921,4), freq = 12))cbind(tt, tt + 1)## PR 883 (cor(x,y) when is.null(y))try(cov(rnorm(10), NULL))try(cor(rnorm(10), NULL))## gave the variance and 1 respectively in 1.2.2.## PR 960 (format() of a character matrix converts to vector)## example from <John.Peters@tip.csiro.au>a <- matrix(c("axx","b","c","d","e","f","g","h"), nrow=2)format(a)format(a, justify="right")## lost dimensions in 1.2.3## PR 963res <- svd(rbind(1:7))## $v lost dimensions in 1.2.3if(res$u[1,1] < 0) {res$u <- -res$u; res$v <- -res$v}res## Make sure on.exit() keeps being evaluated in the proper env [from PD]:## A more complete example:g1 <- function(fitted) { on.exit(remove(fitted)); return(function(foo) foo) }g2 <- function(fitted) { on.exit(remove(fitted)); function(foo) foo }f <- function(g) { fitted <- 1; h <- g(fitted); print(fitted)ls(envir=environment(h)) }f(g1)f(g2)f2 <- function(){g.foo <- g1g.bar <- g2g <- function(x,...) UseMethod("g")fitted <- 1; class(fitted) <- "foo"h <- g(fitted); print(fitted); print(ls(envir=environment(h)))fitted <- 1; class(fitted) <- "bar"h <- g(fitted); print(fitted); print(ls(envir=environment(h)))invisible(NULL)}f2()## The first case in f2() is broken in 1.3.0(-patched).## on.exit() consistency check from Luke:g <- function() as.environment(-1)f <- function(x) UseMethod("f")f.foo <- function(x) { on.exit(e <<- g()); NULL }f.bar <- function(x) { on.exit(e <<- g()); return(NULL) }f(structure(1,class = "foo"))ls(env = e)# only "x", i.e. *not* the GlobalEnvf(structure(1,class = "bar"))stopifnot("x" == ls(env = e))# as above; wrongly was .GlobalEnv in R 1.3.x## some tests that R supports logical variables in formulae## it coerced them to numeric prior to 1.4.0## they should appear like 2-level factors, following SoldCon <- options("contrasts")y <- rnorm(10)x <- rep(c(TRUE, FALSE), 5)model.matrix(y ~ x)lm(y ~ x)DF <- data.frame(x, y)lm(y ~ x, data=DF)options(contrasts=c("contr.helmert", "contr.poly"))model.matrix(y ~ x)lm(y ~ x, data=DF)z <- 1:10lm(y ~ x*z)lm(y ~ x*z - 1)options(oldCon)## diffinv, Adrian Trapletti, 2001-08-27x <- ts(1:10)diffinv(diff(x),xi=x[1])diffinv(diff(x,lag=1,differences=2),lag=1,differences=2,xi=x[1:2])## last had wrong start and end## PR#1072 (Reading Inf and NaN values)as.numeric(as.character(NaN))as.numeric(as.character(Inf))## were NA on Windows at least under 1.3.0.## PR#1092 (rowsum dimnames)rowsum(matrix(1:12, 3,4), c("Y","X","Y"))## rownames were 1,2 in <= 1.3.1.## PR#1115 (saving strings with ascii=TRUE)x <- y <- unlist(as.list(parse(text=paste("\"\\", as.character(as.octmode(1:255)), "\"",sep=""))))save(x, ascii=TRUE, file=(fn <- tempfile(tmpdir = getwd())))load(fn)all(x==y)unlink(fn)## 1.3.1 had trouble with \## Some tests of sink() and connections()## capture all the output to a file.zz <- file("all.Rout", open="wt")sink(zz)sink(zz, type="message")try(log("a"))## back to the consolesink(type="message")sink()try(log("a"))## capture all the output to a file.zz <- file("all.Rout", open="wt")sink(zz)sink(zz, type="message")try(log("a"))## bail outcloseAllConnections()(foo <- showConnections())stopifnot(nrow(foo) == 0)try(log("a"))unlink("all.Rout")## many of these were untested before 1.4.0.## test mean() works on logical but not factorx <- c(TRUE, FALSE, TRUE, TRUE)mean(x)mean(as.factor(x))## last had confusing error message in 1.3.1.## Kurt Hornik 2001-Nov-13z <- table(x = 1:2, y = 1:2)z - 1unclass(z - 1)## lost object bit prior to 1.4.0, so printed class attribute.## PR#1226 (predict.mlm ignored newdata)ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)group <- gl(2,10,20, labels = c("Ctl","Trt"))weight <- c(ctl, trt)data <- data.frame(weight, group)fit <- lm(cbind(w=weight, w2=weight^2) ~ group, data=data)predict(fit, newdata=data[1:2, ])## was 20 rows in R <= 1.4.0## Chong Gu 2002-Feb-8: `.' not expanded in drop1lab <- dimnames(HairEyeColor)HairEye <- cbind(expand.grid(Hair=lab$Hair, Eye=lab$Eye, Sex=lab$Sex,stringsAsFactors = TRUE),Fr = as.vector(HairEyeColor))HairEye.fit <- glm(Fr ~ . ^2, poisson, HairEye)drop1(HairEye.fit)## broken around 1.2.1 it seems.## PR#1329 (subscripting matrix lists)m <- list(a1=1:3, a2=4:6, a3=pi, a4=c("a","b","c"))dim(m) <- c(2,2)mm[,2]m[2,2]## 1.4.1 returned null components: the case was missing from a switch.m <- list(a1=1:3, a2=4:6, a3=pi, a4=c("a","b","c"))matrix(m, 2, 2)## 1.4.1 gave `Unimplemented feature in copyVector'x <- vector("list",6)dim(x) <- c(2,3)x[1,2] <- list(letters[10:11])x## 1.4.1 gave `incompatible types in subset assignment'## printing of matrix listsm <- list(as.integer(1), pi, 3+5i, "testit", TRUE, factor("foo"))dim(m) <- c(1, 6)m## prior to 1.5.0 had quotes for 2D case (but not kD, k > 2),## gave "numeric,1" etc, (even "numeric,1" for integers and factors)## ensure RNG is unaltered.for(type in c("Wichmann-Hill", "Marsaglia-Multicarry", "Super-Duper","Mersenne-Twister", "Knuth-TAOCP", "Knuth-TAOCP-2002")){set.seed(123, type)print(RNGkind())runif(100); print(runif(4))set.seed(1000, type)runif(100); print(runif(4))set.seed(77, type)runif(100); print(runif(4))}RNGkind(normal.kind = "Kinderman-Ramage")set.seed(123)RNGkind()rnorm(4)RNGkind(normal.kind = "Ahrens-Dieter")set.seed(123)RNGkind()rnorm(4)RNGkind(normal.kind = "Box-Muller")set.seed(123)RNGkind()rnorm(4)set.seed(123)runif(4)set.seed(123, "default")set.seed(123, "Marsaglia-Multicarry") ## Careful, not the default anymorerunif(4)## last set.seed failed < 1.5.0.## merging, ggrothendieck@yifan.net, 2002-03-16d.df <- data.frame(x = 1:3, y = c("A","D","E"), z = c(6,9,10))merge(d.df[1,], d.df)## 1.4.1 got confused by inconsistencies in as.character## PR#1394 (levels<-.factor)f <- factor(c("a","b"))levels(f) <- list(C="C", A="a", B="b")f## was [1] C A; Levels: C A in 1.4.1## NA levels in factors(x <- factor(c("a", "NA", "b"), exclude=NULL))## 1.4.1 had wrong order for levelsis.na(x)[3] <- TRUEx## missing entry prints as <NA>## printing/formatting NA strings(x <- c("a", "NA", NA, "b"))print(x, quote = FALSE)paste(x)format(x)format(x, justify = "right")format(x, justify = "none")## not ideal.## print.ts problems ggrothendieck@yifan.net on R-help, 2002-04-01x <- 1:20tt1 <- ts(x,start=c(1960,2), freq=12)tt2 <- ts(10+x,start=c(1960,2), freq=12)cbind(tt1, tt2)## 1.4.1 had `Jan 1961' as `NA 1961'## ...and 1.9.1 had it as `Jan 1960'!!## glm boundary bugs (related to PR#1331)x <- c(0.35, 0.64, 0.12, 1.66, 1.52, 0.23, -1.99, 0.42, 1.86, -0.02,-1.64, -0.46, -0.1, 1.25, 0.37, 0.31, 1.11, 1.65, 0.33, 0.89,-0.25, -0.87, -0.22, 0.71, -2.26, 0.77, -0.05, 0.32, -0.64, 0.39,0.19, -1.62, 0.37, 0.02, 0.97, -2.62, 0.15, 1.55, -1.41, -2.35,-0.43, 0.57, -0.66, -0.08, 0.02, 0.24, -0.33, -0.03, -1.13, 0.32,1.55, 2.13, -0.1, -0.32, -0.67, 1.44, 0.04, -1.1, -0.95, -0.19,-0.68, -0.43, -0.84, 0.69, -0.65, 0.71, 0.19, 0.45, 0.45, -1.19,1.3, 0.14, -0.36, -0.5, -0.47, -1.31, -1.02, 1.17, 1.51, -0.33,-0.01, -0.59, -0.28, -0.18, -1.07, 0.66, -0.71, 1.88, -0.14,-0.19, 0.84, 0.44, 1.33, -0.2, -0.45, 1.46, 1, -1.02, 0.68, 0.84)y <- c(1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0,0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1,1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1,0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1,1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0)try(glm(y ~ x, family = poisson(identity)))## failed because start = NULL in 1.4.1## now gives useful error messageglm(y ~ x, family = poisson(identity), start = c(1,0))## step reduction failed in 1.4.1set.seed(123)y <- rpois(100, pmax(3*x, 0))glm(y ~ x, family = poisson(identity), start = c(1,0))warnings()## extending char arrraysx <- y <- LETTERS[1:2]x[5] <- "C"length(y) <- 5xy## x was filled with "", y with NA in 1.5.0## formula with no intercept, 2002-07-22oldcon <- options(contrasts = c("contr.helmert", "contr.poly"))U <- gl(3, 6, 18, labels=letters[1:3])V <- gl(3, 2, 18, labels=letters[1:3])A <- rep(c(0, 1), 9)B <- rep(c(1, 0), 9)set.seed(1); y <- rnorm(18)terms(y ~ A:U + A:V - 1)lm(y ~ A:U + A:V - 1)$coefficients # 1.5.1 used dummies coding for Vlm(y ~ (A + B) : (U + V) - 1) # 1.5.1 used dummies coding for A:V but not B:Voptions(oldcon)## 1.5.1 miscomputed the first factor in the formula.## quantile extremes, MM 13 Apr 2000 and PR#1852(qq <- sapply(0:5, function(k) {x <- c(rep(-Inf,k+1), 0:k, rep(Inf, k))sapply(1:9, function(typ)quantile(x, pr=(2:10)/10, type=typ))}, simplify="array"))x <- c(-Inf, -Inf, Inf, Inf)median(x)quantile(x)## 1.5.1 had -Inf not NaN in several places## NAs in matrix dimnamesz <- matrix(1:9, 3, 3)dimnames(z) <- list(c("x", "y", NA), c(1, NA, 3))z## NAs in dimnames misaligned when printing in 1.5.1## weighted aov (PR#1930)r <- c(10,23,23,26,17,5,53,55,32,46,10,8,10,8,23,0,3,22,15,32,3)n <- c(39,62,81,51,39,6,74,72,51,79,13,16,30,28,45,4,12,41,30,51,7)trt <- factor(rep(1:4,c(5,6,5,5)))Y <- r/nz <- aov(Y ~ trt, weights=n)## 1.5.1 gave unweighted RSS## rbind (PR#2266)test <- as.data.frame(matrix(1:25, 5, 5))test1 <- matrix(-(1:10), 2, 5)rbind(test, test1)rbind(test1, test)## 1.6.1 treated matrix as a vector.## escapes in non-quoted printingx <- "\\abc\\"names(x) <- 1xprint(x, quote=FALSE)## 1.6.2 had label misaligned## summary on data frames containing data frames (PR#1891)x <- data.frame(1:10)x$z <- data.frame(x=1:10,yyy=11:20)summary(x)## 1.6.2 had NULL labels on output with z columns stacked.## re-orderings in terms.formula (PR#2206)form <- formula(y ~ a + b:c + d + e + e:d)(tt <- terms(form))(tt2 <- terms(formula(tt)))stopifnot(identical(tt, tt2))terms(delete.response(tt))## both tt and tt2 re-ordered the formula < 1.7.0## now try with a dotterms(breaks ~ ., data = warpbreaks)terms(breaks ~ . - tension, data = warpbreaks)terms(breaks ~ . - tension, data = warpbreaks, simplify = TRUE)terms(breaks ~ . ^2, data = warpbreaks)terms(breaks ~ . ^2, data = warpbreaks, simplify = TRUE)## 1.6.2 expanded these formulae out as in simplify = TRUE## printing attributes (PR#2506)(x <- structure(1:4, other=as.factor(LETTERS[1:3])))## < 1.7.0 printed the codes of the factor attribute## add logical matrix replacement indexing for data framesTEMP <- data.frame(VAR1=c(1,2,3,4,5), VAR2=c(5,4,3,2,1), VAR3=c(1,1,1,1,NA))TEMP[,c(1,3)][TEMP[,c(1,3)]==1 & !is.na(TEMP[,c(1,3)])] < -10TEMP#### moved from reg-plot.R as exact output depends on rounding error## PR 390 (axis for small ranges)relrange <- function(x) {## The relative range in EPS unitsr <- range(x)diff(r)/max(abs(r))/.Machine$double.eps}x <- c(0.12345678912345678,0.12345678912345679,0.12345678912345676)# relrange(x) ## 1.0125, but depends on strtodplot(x) # `extra horizontal' ; +- ok on Solaris; label off on Linuxy <- c(0.9999563255363383973418,0.9999563255363389524533,0.9999563255363382863194)## The relative range number:# relrange(y) ## 3.000131, but depends on strtodplot(y)# once gave infinite loop on Solaris [TL]; y-axis too long## Comments: The whole issue was finally deferred to main/graphics.c l.1944## error("relative range of values is too small to compute accurately");## which is not okay.set.seed(101)par(mfrow = c(3,3))for(j.fac in 1e-12* c(10, 1, .7, .3, .2, .1, .05, .03, .01)) {## ====#set.seed(101) # or don'tx <- pi + jitter(numeric(101), f = j.fac)rrtxt <- paste("rel.range =", formatC(relrange(x), dig = 4),"* EPS")cat("j.f = ", format(j.fac)," ; ", rrtxt,"\n",sep="")plot(x, type = "l", main = rrtxt)cat("par(\"usr\")[3:4]:", formatC(par("usr")[3:4], wid = 10),"\n","par(\"yaxp\") : ", formatC(par("yaxp"), wid = 10),"\n\n", sep="")}par(mfrow = c(1,1))## The warnings from inside GScale() will differ in their relrange() ...## >> do sloppy testing## 2003-02-03 hopefully no more. BDR## end of PR 390## scoping rules calling step inside a function"cement" <-structure(list(x1 = c(7, 1, 11, 11, 7, 11, 3, 1, 2, 21, 1, 11, 10),x2 = c(26, 29, 56, 31, 52, 55, 71, 31, 54, 47, 40, 66, 68),x3 = c(6, 15, 8, 8, 6, 9, 17, 22, 18, 4, 23, 9, 8),x4 = c(60, 52, 20, 47, 33, 22, 6, 44, 22, 26, 34, 12, 12),y = c(78.5, 74.3, 104.3, 87.6, 95.9, 109.2, 102.7, 72.5,93.1, 115.9, 83.8, 113.3, 109.4)),.Names = c("x1", "x2", "x3", "x4", "y"), class = "data.frame",row.names = 1:13)teststep <- function(formula, data){d2 <- datafit <- lm(formula, data=d2)step(fit)}teststep(formula(y ~ .), cement)## failed in 1.6.2str(array(1))# not a scalar## na.print="" shouldn't apply to (dim)names!(tf <- table(ff <- factor(c(1:2,NA,2), exclude=NULL)))identical(levels(ff), dimnames(tf)[[1]])str(levels(ff))## not quite ok previous to 1.7.0## PR#3058 printing with na.print and right=TRUEa <- matrix( c(NA, "a", "b", "10",NA, NA, "d", "12",NA, NA, NA, "14"),byrow=T, ncol=4 )print(a, right=TRUE, na.print=" ")print(a, right=TRUE, na.print="----")## misaligned in 1.7.0## assigning factors to dimnamesA <- matrix(1:4, 2)aa <- factor(letters[1:2])dimnames(A) <- list(aa, NULL)Adimnames(A)## 1.7.0 gave internal codes as display and dimnames()## 1.7.1beta gave NAs via dimnames()## 1.8.0 converts factors to character## wishlist PR#2776: aliased coefs in lm/glmset.seed(123)x2 <- x1 <- 1:10x3 <- 0.1*(1:10)^2y <- x1 + rnorm(10)(fit <- lm(y ~ x1 + x2 + x3))summary(fit, cor = TRUE)(fit <- glm(y ~ x1 + x2 + x3))summary(fit, cor = TRUE)## omitted silently in summary.glm < 1.8.0## list-like indexing of data frames with drop specifiedwomen["height"]women["height", drop = FALSE] # same with a warningwomen["height", drop = TRUE] # dittowomen[,"height", drop = FALSE] # no warningwomen[,"height", drop = TRUE] # a vector## second and third were interpreted as women["height", , drop] in 1.7.x## make.namesmake.names("")make.names(".aa")## was "X.aa" in 1.7.1make.names(".2")make.names(".2a") # not valid in Rmake.names(as.character(NA))#### strange names in data framesas.data.frame(list(row.names=17)) # 0 rows in 1.7.1aa <- data.frame(aa=1:3)aa[["row.names"]] <- 4:6aa # fine in 1.7.1A <- matrix(4:9, 3, 2)colnames(A) <- letters[1:2]aa[["row.names"]] <- Aaa## wrong printed names in 1.7.1## assigning to NULL --- now consistently behaves as if assigning to list() !a <- NULLa[["a"]] <- 1aa <- NULLa[["a"]] <- "something"aa <- NULLa[["a"]] <- 1:3a## Last was an error in 1.7.1## examples of 0-rank models, some empty, some rank-deficienty <- rnorm(10)x <- rep(0, 10)(fit <- lm(y ~ 0))summary(fit)anova(fit)predict(fit)predict(fit, data.frame(x=x), se=TRUE)predict(fit, type="terms", se=TRUE)variable.names(fit) #should be emptymodel.matrix(fit)(fit <- lm(y ~ x + 0))summary(fit)anova(fit)predict(fit)predict(fit, data.frame(x=x), se=TRUE)predict(fit, type="terms", se=TRUE)variable.names(fit) #should be emptymodel.matrix(fit)(fit <- glm(y ~ 0))summary(fit)anova(fit)predict(fit)predict(fit, data.frame(x=x), se=TRUE)predict(fit, type="terms", se=TRUE)(fit <- glm(y ~ x + 0))summary(fit)anova(fit)predict(fit)predict(fit, data.frame(x=x), se=TRUE)predict(fit, type="terms", se=TRUE)## Lots of problems in 1.7.x## lm.influence on deficient lm modelsdat <- data.frame(y=rnorm(10), x1=1:10, x2=1:10, x3 = 0, wt=c(0,rep(1, 9)),row.names=letters[1:10])dat[3, 1] <- dat[4, 2] <- NAlm.influence(lm(y ~ x1 + x2, data=dat, weights=wt, na.action=na.omit))lm.influence(lm(y ~ x1 + x2, data=dat, weights=wt, na.action=na.exclude))lm.influence(lm(y ~ 0, data=dat, weights=wt, na.action=na.omit))print(width = 99,lm.influence(lm(y ~ 0, data=dat, weights=wt, na.action=na.exclude))) ; stopifnot(getOption("width") == 80)lm.influence(lm(y ~ 0 + x3, data=dat, weights=wt, na.action=na.omit))lm.influence(lm(y ~ 0 + x3, data=dat, weights=wt, na.action=na.exclude))lm.influence(lm(y ~ 0, data=dat, na.action=na.exclude))## last three misbehaved in 1.7.x, none had proper names.## length of results in ARMAacf when lag.max is usedARMAacf(ar=c(1.3,-0.6, -0.2, 0.1),lag.max=1) # was 4 in 1.7.1ARMAacf(ar=c(1.3,-0.6, -0.2, 0.1),lag.max=2)ARMAacf(ar=c(1.3,-0.6, -0.2, 0.1),lag.max=3)ARMAacf(ar=c(1.3,-0.6, -0.2, 0.1),lag.max=4)ARMAacf(ar=c(1.3,-0.6, -0.2, 0.1),lag.max=5) # failed in 1.7.1ARMAacf(ar=c(1.3,-0.6, -0.2, 0.1),lag.max=6)ARMAacf(ar=c(1.3,-0.6, -0.2, 0.1),lag.max=10)#### Indexing non-existent columns in a data framex <- data.frame(a = 1, b = 2)try(x[c("a", "c")])try(x[, c("a", "c")])try(x[1, c("a", "c")])## Second succeeded, third gave uniformative error message in 1.7.x.## methods(class = ) with namespaces, .Primitives etc (many missing in 1.7.x):meth2gen <- function(cl)noquote(sub(paste("\\.",cl,"$",sep=""),"", c(.S3methods(class = cl))))meth2gen("data.frame")meth2gen("dendrogram")## --> the output may need somewhat frequent updating..## subsetting a 1D array lost the dimensionsx <- array(1:5, dim=c(5))dim(x)dim(x[, drop=TRUE])dim(x[2:3])dim(x[2])dim(x[2, drop=FALSE])dimnames(x) <- list(some=letters[1:5])x[]x[2:3]x[2]x[2, drop=FALSE]## both dim and dimnames lost in 1.8.0## print.dist() didn't show NA's prior to 1.8.1x <- cbind(c(1,NA,2,3), c(NA,2,NA,1))(d <- dist(x))print(d, diag = TRUE)#### offsets in model terms where sometimes not deleted correctlyattributes(terms(~ a + b + a:b + offset(c)))[c("offset", "term.labels")]attributes(terms(y ~ a + b + a:b + offset(c)))[c("offset", "term.labels")]attributes(terms(~ offset(c) + a + b + a:b))[c("offset", "term.labels")]attributes(terms(y ~ offset(c) + a + b + a:b))[c("offset", "term.labels")]## errors prior to 1.8.1## 0-level factors gave nonsensical answers in model.matrixm <- model.frame(~x, data.frame(x=NA), na.action=na.pass)model.matrix(~x, m)lm.fit <- lm(y ~ x, data.frame(x=1:10, y=1:10))try(predict(lm.fit, data.frame(x=NA)))## wrong answers in 1.8.0, refused to run in 1.8.1## failure to print data frame containing arrays## raised by John Fox on R-devel on 2004-01-08y1 <- array(1:10, dim=10)y2 <- array(1:30, dim=c(10,3), dimnames=list(NULL, letters[1:3]))y3 <- array(1:40, dim=c(10,2,2),dimnames=list(NULL, letters[1:2], NULL))data.frame(y=y1)data.frame(y=y2)data.frame(y=y3)as.data.frame(y1)as.data.frame(y2)as.data.frame(y3)X <- data.frame(x=1:10)X$y <- y1Xsapply(X, dim)X$y <- y2Xsapply(X, dim)X$y <- y3Xsapply(X, dim)## The last one fails in S.## test of user hooksfor(id in c("A", "B")) {eval(substitute({setHook(packageEvent("stats4", "onLoad"),function(pkgname, ...) cat("onLoad", sQuote(pkgname), id, "\n"));setHook(packageEvent("stats4", "attach"),function(pkgname, ...) cat("attach", sQuote(pkgname), id, "\n"));setHook(packageEvent("stats4", "detach"),function(pkgname, ...) cat("detach", sQuote(pkgname), id, "\n"));setHook(packageEvent("stats4", "onUnload"),function(pkgname, ...) cat("onUnload", sQuote(pkgname), id, "\n"))},list(id=id)))}loadNamespace("stats4")library("stats4")detach("package:stats4")unloadNamespace("stats4")## Just tests## rep(0-length-vector, length.out > 0)rep(integer(0), length.out=0)rep(integer(0), length.out=10)typeof(.Last.value)rep(logical(0), length.out=0)rep(logical(0), length.out=10)typeof(.Last.value)rep(numeric(0), length.out=0)rep(numeric(0), length.out=10)typeof(.Last.value)rep(character(0), length.out=0)rep(character(0), length.out=10)typeof(.Last.value)rep(complex(0), length.out=0)rep(complex(0), length.out=10)typeof(.Last.value)rep(list(), length.out=0)rep(list(), length.out=10)## always 0-length before 1.9.0## supplying 0-length data to array and matrixarray(numeric(0), c(2, 2))array(list(), c(2,2))# worked < 1.8.0, error in 1.8.xmatrix(character(0), 1, 2)matrix(integer(0), 1, 2)matrix(logical(0), 1, 2)matrix(numeric(0), 1, 2)matrix(complex(0), 1, 2)matrix(list(), 1, 2)## did not work < 1.9.0## S compatibility change in 1.9.0rep(1:2, each=3, length=12)## used to pad with NAs.## PR#6510: aov() with error and -1set.seed(1)test.df <- data.frame (y=rnorm(8), a=gl(2,1,8), b=gl(2,3,8),c=gl(2,4,8))aov(y ~ a + b + Error(c), data=test.df)aov(y ~ a + b - 1 + Error(c), data=test.df)## wrong assignment to strata labels < 1.9.0## Note this is unbalanced and not a good examplebinom.test(c(800,10))# p-value < epsilon## aov with a singular error modelrd <- c(16.53, 12.12, 10.04, 15.32, 12.33, 10.1, 17.09, 11.69, 11.81, 14.75,10.72, 8.79, 13.14, 9.79, 8.36, 15.62, 9.64, 8.72, 15.32,11.35, 8.52, 13.27, 9.74, 8.78, 13.16, 10.16, 8.4, 13.08, 9.66,8.16, 12.17, 9.13, 7.43, 13.28, 9.16, 7.92, 118.77, 78.83, 62.2,107.29, 73.79, 58.59, 118.9, 66.35, 53.12, 372.62, 245.39, 223.72,326.03, 232.67, 209.44, 297.55, 239.71, 223.8)sample.df <- data.frame(dep.variable=rd,subject=factor(rep(paste("subj",1:6, sep=""),each=9)),f1=factor(rep(rep(c("f1","f2","f3"),each=6),3)),f2=factor(rep(c("g1","g2","g3"),each=18)))sample.aov <- aov(dep.variable ~ f1 * f2 + Error(subject/(f1+f2)), data=sample.df)sample.aovsummary(sample.aov)sample.aov <- aov(dep.variable ~ f1 * f2 + Error(subject/(f2+f1)), data=sample.df)sample.aovsummary(sample.aov)## failed in 1.8.1## PR#6645 stem() with near-constant valuesstem(rep(1, 100))stem(rep(0.1, 10))stem(c(rep(1, 10), 1+1.e-8))stem(c(rep(1, 10), 1+1.e-9))stem(c(rep(1, 10), 1+1.e-10), atom=0) # integer-overflow is avoided.## had integer overflows in 1.8.1, and silly shifts of decimal point## PR#6633 warnings with vector op matrix, and moreset.seed(1)x1 <- rnorm(3)y1 <- rnorm(4)x1 * y1x1 * as.matrix(y1) # no warning in 1.8.1x1 * matrix(y1,2,2)# dittoz1 <- x1 > 0z2 <- y1 > 0z1 & z2z1 & as.matrix(z2) # no warning in 1.8.1x1 < y1 # no warning in 1.8.1x1 < as.matrix(y1) # ditto#### summary method for mlelibrary(stats4)N <- c(rep(3:6, 3), 7,7, rep(8,6), 9,9, 10,12)# sample from Pois(lam = 7)summary(mle(function(Lam = 1) -sum(dpois(N, Lam))))## "Coefficients" was "NULL" in 1.9.0's "devel"## PR#6656 terms.formula(simplify = TRUE) was losing offset terms## successive offsets caused problemsdf <- data.frame(x=1:4, y=sqrt( 1:4), z=c(2:4,1))fit1 <- glm(y ~ offset(x) + z, data=df)update(fit1, ". ~.")$call## lost offset in 1.7.0 to 1.8.1terms(y ~ offset(x) + offset(log(x)) + z, data=df)## failed to remove second offset from formula in 1.8.1terms(y ~ offset(x) + z - z, data=df, simplify = TRUE)## first fix failed for models with no non-offset terms.## only the first two were wrong up to 1.8.1:3:4 * 1e-1008:11* 1e-1001:2 * 1e-991:2 * 1e+998:11* 1e+993:4 * 1e+100#### negative subscripts could be mixed with NAsx <- 1:3try(x[-c(1, NA)])## worked on some platforms, segfaulted on others in 1.8.1## vector 'border' (and no 'pch', 'cex' nor 'bg'):boxplot(count ~ spray, data = InsectSprays, border=2:7)## gave warnings in 1.9.0summary(as.Date(paste("2002-12", 26:31, sep="-")))## printed all "2002.-12-29" in 1.9.1 {because digits was too small}as.matrix(data.frame(d = as.POSIXct("2004-07-20")))## gave a warning in 1.9.1## Dump should quote when necessary (PR#6857)x <- quote(b)dump("x", "")## doesn't quote b in 1.9.0## some checks of indexing by character, used to test hashing codex <- 1:26names(x) <- lettersx[c("a", "aa", "aa")] <- 100:102xx <- 1:26names(x) <- rep("", 26)x[c("a", "aa", "aa")] <- 100:102x#### tests of raw type# tests of logic operatorsx <- "A test string"(y <- charToRaw(x))(xx <- c(y, as.raw(0), charToRaw("more")))!yy & as.raw(15)y | as.raw(128)# tests of binary read/writezz <- file("testbin", "wb")writeBin(xx, zz)close(zz)zz <- file("testbin", "rb")(yy <- readBin(zz, "raw", 100))seek(zz, 0, "start")readBin(zz, "integer", n=100, size = 1) # read as small integersseek(zz, 0, "start")readBin(zz, "character", 100) # is confused by embedded nul.seek(zz, 0, "start")readChar(zz, length(xx)) # truncates at embedded nulseek(zz) # make sure current position is reported properlyclose(zz)unlink("testbin")# tests of ASCII read/write.cat(xx, file="testascii")scan("testascii", what=raw(0))unlink("testascii")#### Example of prediction not from newdata as intended.set.seed(1)y <- rnorm(10)x <- cbind(1:10, sample(1:10)) # matrixxt <- cbind(1:2, 3:4)(lm1 <- lm(y ~ x))predict(lm1, newdata = data.frame(x= xt))## warns as from 2.0.0## eval could alter a data.frame/list second argumentdata(trees)a <- treeseval(quote({Girth[1]<-NA;Girth}),a)a[1, ]trees[1, ]## both a and trees got altered in 1.9.1## write.table did not apply qmethod to col.names (PR#7171)x <- data.frame("test string with \"" = c("a \" and a '"), check.names=FALSE)write.table(x)write.table(x, qmethod = "double")## Quote in col name was unescaped in 1.9.1.## extensions to read.tableMat <- matrix(c(1:3, letters[1:3], 1:3, LETTERS[1:3],c("2004-01-01", "2004-02-01", "2004-03-01"),c("2004-01-01 12:00", "2004-02-01 12:00", "2004-03-01 12:00")),3, 6)foo <- tempfile(tmpdir = getwd())write.table(Mat, foo, col.names = FALSE, row.names = FALSE)read.table(foo, colClasses = c(NA, NA, "NULL", "character", "Date", "POSIXct"),stringsAsFactors=TRUE)unlist(sapply(.Last.value, class))read.table(foo, colClasses = c("factor",NA,"NULL","factor","Date","POSIXct"),stringsAsFactors=TRUE)unlist(sapply(.Last.value, class))read.table(foo, colClasses = c(V4="character"), stringsAsFactors=TRUE)unlist(sapply(.Last.value, class))unlink(foo)## added in 2.0.0## write.table with complex columns (PR#7260, in part)write.table(data.frame(x = 0.5+1:4, y = 1:4 + 1.5i), file = "")# printed all as complex in 2.0.0.write.table(data.frame(x = 0.5+1:4, y = 1:4 + 1.5i), file = "", dec=",")## used '.' not ',' in 2.0.0## splinefun() value test(x <- seq(0,6, length=25))mx <- sapply(c("fmm", "nat", "per"),function(m) splinefun(1:5, c(1,2,4,3,1), method = m)(x))cbind(x,mx)## infinite loop in read.fwf (PR#7350)cat(file="test.txt", sep = "\n", "# comment 1", "1234567 # comment 2","1 234567 # comment 3", "12345 67 # comment 4", "# comment 5")read.fwf("test.txt", width=c(2,2,3), skip=1, n=4) # loopedread.fwf("test.txt", width=c(2,2,3), skip=1) # 1 line shortread.fwf("test.txt", width=c(2,2,3), skip=0)unlink("test.txt")#### split was not handling lists and rawssplit(as.list(1:3), c(1,1,2))(y <- charToRaw("A test string"))(z <- split(y, rep(1:5, times=c(1,1,4,1,6))))sapply(z, rawToChar)## wrong results in 2.0.0## tests of changed S3 implicit classes in 2.1.0foo <- function(x, ...) UseMethod("foo")foo.numeric <- function(x) cat("numeric arg\n")foo(1:10)foo(pi)foo(matrix(1:10, 2, 5))foo.integer <- function(x) cat("integer arg\n")foo.double <- function(x) cat("double arg\n")foo(1:10)foo(pi)foo(matrix(1:10, 2, 5))#### str() interpreted escape sequences prior to 2.1.0x <- "ab\bc\ndef"str(x)str(x, vec.len=0)# failed in rev 32244str(factor(x))x <- c("a", NA, "b")factor(x)factor(x, exclude="")str(x)str(factor(x))str(factor(x, exclude=""))#### print.factor(quote=TRUE) was not quoting levelsx <- c("a", NA, "b", 'a " test') #" (comment for fontification)factor(x)factor(x, exclude="")print(factor(x), quote=TRUE)print(factor(x, exclude=""), quote=TRUE)## last two printed levels differently from values in 2.0.1## write.table in marginal casesx <- matrix(, 3, 0)write.table(x) # 3 rowswrite.table(x, row.names=FALSE)# note: scan and read.table won't read this as they take empty fields as NA## was 1 row in 2.0.1## More tests of write.tablex <- list(a=1, b=1:2, c=3:4, d=5)dim(x) <- c(2,2)xwrite.table(x)x1 <- data.frame(a=1:2, b=I(matrix(LETTERS[1:4], 2, 2)), c = c("(i)", "(ii)"))x1write.table(x1) # In 2.0.1 had 3 headers, 4 colswrite.table(x1, quote=c(2,3,4))x2 <- data.frame(a=1:2, b=I(list(a=1, b=2)))x2write.table(x2)x3 <- seq(as.Date("2005-01-01"), len=6, by="day")x4 <- data.frame(x=1:6, y=x3)dim(x3) <- c(2,3)x3write.table(x3) # matrix, so loses classx4write.table(x4) # preserves class, does not quote#### Problem with earlier regexp code spotted by KHgrep("(.*s){2}", "Arkansas", v = TRUE)grep("(.*s){3}", "Arkansas", v = TRUE)grep("(.*s){3}", state.name, v = TRUE)## Thought Arkansas had 3 s's.## Replacing part of a non-existent column could create a short column.xx<- data.frame(a=1:4, b=letters[1:4])xx[2:3, "c"] <- 2:3## gave short column in R < 2.1.0.## add1/drop1 could give misleading results if missing values were involvedy <- rnorm(1:20)x <- 1:20; x[10] <- NAx2 <- runif(20); x2[20] <- NAfit <- lm(y ~ x)drop1(fit)res <- try(stats:::drop1.default(fit))stopifnot(inherits(res, "try-error"))add1(fit, ~ . +x2)res <- try(stats:::add1.default(fit, ~ . +x2))stopifnot(inherits(res, "try-error"))## 2.0.1 ran and gave incorrect answers.## (PR#7789) escaped quotes in the first five lines for read.tabletf <- tempfile(tmpdir = getwd())x <- c("6 'TV2 Shortland Street'","2 'I don\\\'t watch TV at 7'","1 'I\\\'m not bothered, whatever that looks good'","2 'I channel surf'")writeLines(x, tf)read.table(tf)x <- c("6 'TV2 Shortland Street'","2 'I don''t watch TV at 7'","1 'I''m not bothered, whatever that looks good'","2 'I channel surf'")writeLines(x, tf)read.table(tf, sep=" ")unlink(tf)## mangled in 2.0.1## (PR#7802) printCoefmat(signif.legend =FALSE) failedset.seed(123)cmat <- cbind(rnorm(3, 10), sqrt(rchisq(3, 12)))cmat <- cbind(cmat, cmat[,1]/cmat[,2])cmat <- cbind(cmat, 2*pnorm(-cmat[,3]))colnames(cmat) <- c("Estimate", "Std.Err", "Z value", "Pr(>z)")printCoefmat(cmat, signif.stars = TRUE)printCoefmat(cmat, signif.stars = TRUE, signif.legend = FALSE)# no stars, so no legendprintCoefmat(cmat, signif.stars = FALSE)printCoefmat(cmat, signif.stars = TRUE, signif.legend = TRUE)## did not work in 2.1.0## PR#7824 subscripting an array by a matrixx <- matrix(1:6, ncol=2)x[rbind(c(1,1), c(2,2))]x[rbind(c(1,1), c(2,2), c(0,1))]x[rbind(c(1,1), c(2,2), c(0,0))]x[rbind(c(1,1), c(2,2), c(0,2))]x[rbind(c(1,1), c(2,2), c(0,3))]x[rbind(c(1,1), c(2,2), c(1,0))]x[rbind(c(1,1), c(2,2), c(2,0))]x[rbind(c(1,1), c(2,2), c(3,0))]x[rbind(c(1,0), c(0,2), c(3,0))]x[rbind(c(1,0), c(0,0), c(3,0))]x[rbind(c(1,1), c(2,2), c(1,2))]x[rbind(c(1,1), c(2,NA), c(1,2))]x[rbind(c(1,0), c(2,NA), c(1,2))]try(x[rbind(c(1,1), c(2,2), c(-1,2))])try(x[rbind(c(1,1), c(2,2), c(-2,2))])try(x[rbind(c(1,1), c(2,2), c(-3,2))])try(x[rbind(c(1,1), c(2,2), c(-4,2))])try(x[rbind(c(1,1), c(2,2), c(-1,-1))])try(x[rbind(c(1,1,1), c(2,2,2))])# verify that range checks are applied to negative indicesx <- matrix(1:6, ncol=3)try(x[rbind(c(1,1), c(2,2), c(-3,3))])try(x[rbind(c(1,1), c(2,2), c(-4,3))])## generally allowed in 2.1.0.## printing RAW matrices/arrays was not implementeds <- sapply(0:7, function(i) rawShift(charToRaw("my text"),i))sdim(s) <- c(7,4,2)s## empty < 2.1.1## interpretation of '.' directly by model.matrixdd <- data.frame(a = gl(3,4), b = gl(4,1,12))model.matrix(~ .^2, data = dd)## lost ^2 in 2.1.1## add1.lm and drop.lm did not know about offsets (PR#8049)set.seed(2)y <- rnorm(10)z <- 1:10lm0 <- lm(y ~ 1)lm1 <- lm(y ~ 1, offset = 1:10)lm2 <- lm(y ~ z, offset = 1:10)add1(lm0, scope = ~ z)anova(lm1, lm2)add1(lm1, scope = ~ z)drop1(lm2)## Last two ignored the offset in 2.1.1## tests of raw conversionas.raw(1234)as.raw(list(a=1234))## 2.1.1: spurious and missing messages, wrong result for second.### end of tests added in 2.1.1 patched ##### Tests of logical matrix indexing with NAsdf1 <- data.frame(a = c(NA, 0, 3, 4)); m1 <- as.matrix(df1)df2 <- data.frame(a = c(NA, 0, 0, 4)); m2 <- as.matrix(df2)df1[df1 == 0] <- 2; df1m1[m1 == 0] <- 2; m1df2[df2 == 0] <- 2; df2 # not allowed in 2.{0,1}.zm2[m2 == 0] <- 2; m2df1[df1 == 2] # this is first coerced to a matrix, and drops to a vectordf3 <- data.frame(a=1:2, b=2:3)df3[df3 == 2] # had spurious names# but not allowed## (modified to make printed result the same whether numeric() is## compiled or interpreted)## try(df2[df2 == 2] <- 1:2)## try(m2[m2 == 2] <- 1:2)tryCatch(df2[df2 == 2] <- 1:2,error = function(e) paste("Error:", conditionMessage(e)))tryCatch(m2[m2 == 2] <- 1:2,error = function(e) paste("Error:", conditionMessage(e)))#### vector indexing of matrices: issue is when rownames are used# 1D arraym1 <- c(0,1,2,0)dim(m1) <- 4dimnames(m1) <- list(1:4)m1[m1 == 0] # has rownamesm1[which(m1 == 0)] # has rownamesm1[which(m1 == 0, arr.ind = TRUE)] # no names < 2.2.0 (side effect of PR#937)# 2D array with 2 colsm2 <- as.matrix(data.frame(a=c(0,1,2,0), b=0:3))m2[m2 == 0] # a vector, had names < 2.2.0m2[which(m2 == 0)] # a vector, had names < 2.2.0m2[which(m2 == 0, arr.ind = TRUE)] # no names (PR#937)# 2D array with one col: could use rownames but do not.m21 <- m2[, 1, drop = FALSE]m21[m21 == 0]m21[which(m21 == 0)]m21[which(m21 == 0, arr.ind = TRUE)]## not consistent < 2.2.0: S never gives names## tests of indexing as quoted in Extract.Rdx <- NULLx$foo <- 2x # now, a listx <- NULLx[[2]] <- pix # now, a list, toox <- NULLx[[1]] <- 1:3x # list#### printing of a kernel:kernel(1)## printed wrongly in R <= 2.1.1## using NULL as a replacement valueDF <- data.frame(A=1:2, B=3:4)try(DF[2, 1:3] <- NULL)## wrong error message in R < 2.2.0## tests of signifob <- 0:9 * 2000print(signif(ob, 3), digits=17) # had rounding error in 2.1.1signif(1.2347e-305, 4)signif(1.2347e-306, 4) # only 3 digits in 2.1.1signif(1.2347e-307, 4)##### end of tests added in 2.2.0 patched ##### printing lists with NA namesA <- list(1, 2)names(A) <- c("NA", NA)A## both printed as "NA" in 2.2.0## subscripting with both NA and "NA" namesx <- 1:4names(x) <- c(NA, "NA", "a", "")x[names(x)]## 2.2.0 had the second matching the first.lx <- as.list(x)lx[[as.character(NA)]]lx[as.character(NA)]## 2.2.0 had both matching element 1## data frame replacement subscripting# Charles C. Berry, R-devel, 2005-10-26a.frame <- data.frame( x=letters[1:5] )a.frame[ 2:5, "y" ] <- letters[2:5]a.frame # added rows 1:4# and adding and replacing matrices faileda.frame[ ,"y" ] <- matrix(1:10, 5, 2)a.framea.frame[3:5 ,"y" ] <- matrix(1:6, 3, 2)a.framea.frame <- data.frame( x=letters[1:5] )a.frame[3:5 ,"y" ] <- matrix(1:6, 3, 2)a.frame## failed/wrong ans in 2.2.0### end of tests added in 2.2.0 patched ##### test of fix of trivial warning PR#8252pairs(iris[1:4], oma=rep(3,4))## warned in 2.2.0 only## str(<dendrogram>)dend <- as.dendrogram(hclust(dist(USArrests), "ave")) # "print()" methoddend2 <- cut(dend, h=70)str(dend2$upper)## {{for Emacs: `}} gave much too many spaces in 2.2.[01]## formatC on Windows (PR#8337)xx <- pi * 10^(-5:4)cbind(formatC(xx, wid = 9))cbind(formatC(xx, wid = 9, flag = "-"))cbind(formatC(xx, wid = 9, flag = "0"))## extra space on 2.2.1## an impossible glm fitsuccess <- c(13,12,11,14,14,11,13,11,12)failure <- c(0,0,0,0,0,0,0,2,2)predictor <- c(0, 5^(0:7))try(glm(cbind(success,failure) ~ 0+predictor, family = binomial(link="log")))# no coefficient is possible as the first case will have mu = 1## 2.2.1 gave a subscript out of range warning instead.## error message from solve (PR#8494)temp <- diag(1, 5)[, 1:4]rownames(temp) <- as.character(1:5)colnames(temp) <- as.character(1:4)try(solve(temp))# also complextry(solve(temp+0i))# and non-comformant systemstry(solve(temp, diag(3)))## gave errors from rownames<- in 2.2.1## PR#8462 terms.formula(simplify = TRUE) needs parentheses.update.formula (Reaction ~ Days + (Days | Subject), . ~ . + I(Days^2))## < 2.3.0 dropped parens on second term.## PR#8528: errors in the post-2.1.0 pgammapgamma(seq(0.75, 1.25, by=0.05)*1e100, shape = 1e100, log=TRUE)pgamma(seq(0.75, 1.25, by=0.05)*1e100, shape = 1e100, log=TRUE, lower=FALSE)pgamma(c(1-1e-10, 1+1e-10)*1e100, shape = 1e100)pgamma(0.9*1e25, 1e25, log=TRUE)## were NaN, -Inf etc in 2.2.1.## + for POSIXt objects was non-commutative# SPSS-style datesc(10485849600,10477641600,10561104000,10562745600)+ISOdate(1582,10,14)## was in the local time zone in 2.2.1.## Limiting lines on deparse (wishlist PR#8638)op <- options(deparse.max.lines = 3)f <- function(...) browser()do.call(f, mtcars)cop <- c(op, options(error = expression(NULL)))f <- function(...) stop()do.call(f, mtcars)traceback()## Debugger can handle a function that has a single function call as its bodyg <- function(fun) fun(1)debug(g)g(function(x) x+1)options(op)## unlimited < 2.3.0## row names in as.table (PR#8652)as.table(matrix(1:60, ncol=2))## rows past 26 had NA row names## summary on a glm with zero weights and estimated dispersion (PR#8720)y <- rnorm(10)x <- 1:10w <- c(rep(1,9), 0)summary(glm(y ~ x, weights = w))summary(glm(y ~ x, subset = w > 0))## has NA dispersion in 2.2.1## substitute was losing "..." after r37269yaa <- function(...) substitute(list(...))yaa(foo(...))## and wasn't substituting after "..."substitute(list(..., x), list(x=1))## fixed for 2.3.0## uniroot never warned (PR#8750)ff <- function(x) (x-pi)^3uniroot(ff, c(-10,10), maxiter=10)## should warn, did not < 2.3.0### end of tests added in 2.3.0 ##### prod etc on empty lists and raw vectorstry(min(list()))try(max(list()))try(sum(list()))try(prod(list()))try(min(raw()))try(max(raw()))try(sum(raw()))try(prod(raw()))## Inf, -Inf, list(NULL) etc in 2.2.1r <- hist(rnorm(100), plot = FALSE, breaks = 12,## arguments which don't make sense for plot=FALSE - give a warning:xlab = "N(0,1)", col = "blue")## gave no warning in 2.3.0 and earlier## rbind.data.frame on permuted cols (PR#8868)d1 <- data.frame(x=1:10, y=letters[1:10], z=1:10)d2 <- data.frame(y=LETTERS[1:5], z=5:1, x=7:11)rbind(d1, d2)# got factor y wrong in 2.3.0# and failed with duplicated col names.d1 <- data.frame(x=1:2, y=5:6, x=8:9, check.names=FALSE)d2 <- data.frame(x=3:4, x=-(1:2), y=8:9, check.names=FALSE)rbind(d1, d2)## corrupt in 2.3.0## sort.list on complex vectors was unimplemented prior to 2.4.0x <- rep(2:1, c(2, 2)) + 1i*c(4, 1, 2, 3)(o <- sort.list(x))x[o]sort(x) # for a cross-check#### PR#9044 write.table(quote=TRUE, row.names=FALSE) did not quote column namesm <- matrix(1:9, nrow=3, dimnames=list(c("A","B","C"), c("I","II","III")))write.table(m)write.table(m, col.names=FALSE)write.table(m, row.names=FALSE)# wrong < 2.3.1 patched.write.table(m, quote=FALSE)write.table(m, col.names=FALSE, quote=FALSE)write.table(m, row.names=FALSE, quote=FALSE)d <- as.data.frame(m)write.table(d)write.table(d, col.names=FALSE)write.table(d, row.names=FALSE)write.table(d, quote=FALSE)write.table(d, col.names=FALSE, quote=FALSE)write.table(d, row.names=FALSE, quote=FALSE)write.table(m, quote=numeric(0)) # not the same as FALSE#### removing variable from baseenvtry(remove("ls", envir=baseenv()))try(remove("ls", envir=asNamespace("base")))## no message in 2.3.1## tests of behaviour of factors(x <- factor(LETTERS[1:5])[2:4])x[2]x[[2]]stopifnot(identical(x[2], x[[2]]))as.list(x)(xx <- unlist(as.list(x)))stopifnot(identical(x, xx))as.vector(x, "list")(sx <- sapply(x, function(.).))stopifnot(identical(x, sx))## changed in 2.4.0## as.character on a factor with "NA" levelas.character(as.factor(c("AB", "CD", NA)))as.character(as.factor(c("NA", "CD", NA))) # use <NA> is 2.3.xas.vector(as.factor(c("NA", "CD", NA))) # but this did not## used <NA> before## [ on a zero-column data frame, names of suchdata.frame()[FALSE]names(data.frame())# gave NULL names and hence spurious warning.## residuals from zero-weight glm fitsd.AD <- data.frame(treatment = gl(3,3), outcome = gl(3,1,9),counts = c(18,17,15,20,10,20,25,13,12))fit <- glm(counts ~ outcome + treatment, family = poisson,data = d.AD, weights = c(0, rep(1,8)))print(residuals(fit, type="working"),width = 37) # first was NA < 2.4.0 // using new 'width'## working residuals were NA for zero-weight cases.fit2 <- glm(counts ~ outcome + treatment, family = poisson,data = d.AD, weights = c(0, rep(1,8)), y = FALSE)for(z in c("response", "working", "deviance", "pearson"))stopifnot(all.equal(residuals(fit, type=z), residuals(fit2, type=z),scale = 1, tolerance = 1e-10))## apply on arrays with zero extents## Robin Hankin, R-help, 2006-02-13A <- array(0, c(3, 0, 4))dimnames(A) <- list(D1 = letters[1:3], D2 = NULL, D3 = LETTERS[1:4])f <- function(x) 5apply(A, 1:2, f)apply(A, 1, f)apply(A, 2, f)## dropped dims in 2.3.1## print a factor with namesstructure(factor(1:4), names = letters[1:4])## dropped names < 2.4.0## some tests of factor matricesA <- factor(7:12)dim(A) <- c(2, 3)Astr(A)A[, 1:2]A[, 1:2, drop=TRUE]A[1,1] <- "9"A## misbehaved < 2.4.0## [dpqr]t with vector ncpnc <- c(0, 0.0001, 1)dt(1.8, 10, nc)pt(1.8, 10, nc)qt(0.95, 10, nc)## gave warnings in 2.3.1, short answer for qt.dt(1.8, 10, -nc[-1])pt(1.8, 10, -nc[-1])qt(0.95, 10, -nc[-1])## qt in 2.3.1 did not allow negative ncp.## merge() used to insert row names as factor, not character, so## sorting was unexpected.A <- data.frame(a = 1:4)row.names(A) <- c("2002-11-15", "2002-12-15", "2003-01-15", "2003-02-15")B <- data.frame(b = 1:4)row.names(B) <- c("2002-09-15", "2002-10-15", "2002-11-15", "2002-12-15")merge(A, B, by=0, all=TRUE)## assigning to a list loop index could alter the index (PR#9216)L <- list(a = list(txt = "original value"))f <- function(LL) {for (ll in LL) ll$txt <- "changed in f"LL}f(L)L## both were changed < 2.4.0## summary.mlm misbehaved with na.action = na.excluden <- 50x <- runif(n=n)y1 <- 2 * x + rnorm(n=n)y2 <- 5 * x + rnorm(n=n)y2[sample(1:n, size=5)] <- NAy <- cbind(y1, y2)fit <- lm(y ~ 1, na.action="na.exclude")summary(fit)## failed < 2.4.0RNGkind("default","default")## reset to default - ease R core## prettyNum lost attributes (PR#8695)format(matrix(1:16, 4), big.mark = ",")## was a vector < 2.4.0## printing of complex numbers of very different magnitudes1e100 + 1e44i1e100 + pi*1i*10^(c(-100,0,1,40,100))## first was silly, second not rounded correctly in 2.2.0 - 2.3.1## We don't get them lining up, but that is a printf issue## that only happens for very large complex nos.### end of tests added in 2.4.0 ##### Platform-specific behaviour in lowess reported to R-help## 2006-10-12 by Frank Harrellx <- c(0,7,8,14,15,120,242)y <- c(122,128,130,158,110,110,92)lowess(x, y, iter=0)lowess(x, y)## MAD of iterated residuals was zero, and result depended on the platform.## PR#9263: problems with R_Visiblea <- list(b=5)a[[(t<-'b')]]x <- matrix(5:-6, 3)x[2, invisible(3)]## both invisible in 2.4.0### end of tests added in 2.4.1 ##### tests of deparsingx <-list(a = NA, b = as.integer(NA), c=0+NA, d=0i+NA,e = 1, f = 1:1, g = 1:3, h = c(NA, 1:3),i = as.character(NA), j = c("foo", NA, "bar"))dput(x, control=NULL)dput(x, control="keepInteger")dput(x, control="keepNA")dput(x)dput(x, control="all")dput(x, control=c("all", "S_compatible"))tmp <- tempfile(tmpdir = getwd())dput(x, tmp, control="all")stopifnot(identical(dget(tmp), x))dput(x, tmp, control=c("all", "S_compatible"))stopifnot(identical(dget(tmp), x))unlink(tmp)## changes in 2.5.0## give better error message for nls with no parameters## Ivo Welch, R-help, 2006-12-23.d <- data.frame(y= runif(10), x=runif(10))try(nls(y ~ 1/(1+x), data = d, start=list(x=0.5,y=0.5), trace=TRUE))## changed in 2.4.1 patched## cut(breaks="years"), in part PR#9433cut(as.Date(c("2000-01-17","2001-01-13","2001-01-20")), breaks="years")cut(as.POSIXct(c("2000-01-17","2001-01-13","2001-01-20")), breaks="years")## did not get day 01 < 2.4.1 patched## manipulating rownames: problems in pre-2.5.0A <- data.frame(a=character(0))try(row.names(A) <- 1:10) # succeeded in Dec 2006A <- list(a=1:3)class(A) <- "data.frame"row.names(A) <- letters[24:26] # failed at one point in Dec 2006A#### extreme cases for subsetting of data framesw <- women[1, ]w[]w[,drop = TRUE]w[1,]w[,]w[1, , drop = FALSE]w[, , drop = FALSE]w[1, , drop = TRUE]w[, , drop = TRUE]## regression test: code changed for 2.5.0## data.frame() with zero columns ignored 'row.names'(x <- data.frame(row.names=1:4))nrow(x)row.names(x)attr(x, "row.names")## ignored prior to 2.5.0.## identical on data.framesd0 <- d1 <- data.frame(1:4, row.names=1:4)row.names(d0) <- NULLdput(d0)dput(d1)identical(d0, d1)all.equal(d0, d1)row.names(d1) <- as.character(1:4)dput(d1)identical(d0, d1)all.equal(d0, d1)## identical used internal representation prior to 2.5.0## all.equal# ignored check.attributes in 2.4.1all.equal(data.frame(x=1:5, row.names=letters[1:5]),data.frame(x=1:5,row.names=LETTERS[1:5]),check.attributes=FALSE)# treated logicals as numericall.equal(c(T, F, F), c(T, T, F))all.equal(c(T, T, F), c(T, F, F))# ignored raw:all.equal(as.raw(1:3), as.raw(1:3))all.equal(as.raw(1:3), as.raw(3:1))#### tests of deparsing# if we run this from stdin, we will have no source, so fake itf <- function(x, xm = max(1L, x)) {xx <- 0L; yy <- NA_real_}attr(f, "srcref") <- srcref(srcfilecopy("","function(x, xm = max(1L, x)) {xx <- 0L; yy <- NA_real_}"),c(1L, 1L, 1L, 56L))f # uses the sourcedput(f) # not sourcedput(f, control="all") # uses the sourcecat(deparse(f), sep="\n")dump("f", file="")# remove the sourceattr(f, "srcref") <- NULLfdput(f, control="all")dump("f", file="")expression(bin <- bin + 1L)## did not preserve e.g. 1L at some point in pre-2.5.0## NAs in substr were handled as large negative numbersx <- "abcde"substr(x, 1, 3)substr(x, NA, 1)substr(x, 1, NA)substr(x, NA, 3) <- "abc"; xsubstr(x, 1, NA) <- "AA"; xsubstr(x, 1, 2) <- NA_character_; x## "" or no change in 2.4.1, except last## regression tests for pmin/pmax, rewritten in C for 2.5.0# NULL == integer(0)pmin(NULL, integer(0))pmax(integer(0), NULL)pmin(NULL, 1:3)# now okpmax(pi, NULL, 2:4)x <- c(1, NA, NA, 4, 5)y <- c(2, NA, 4, NA, 3)pmin(x, y)stopifnot(identical(pmin(x, y), pmin(y, x)))pmin(x, y, na.rm=TRUE)stopifnot(identical(pmin(x, y, na.rm=TRUE), pmin(y, x, na.rm=TRUE)))pmax(x, y)stopifnot(identical(pmax(x, y), pmax(y, x)))pmax(x, y, na.rm=TRUE)stopifnot(identical(pmax(x, y, na.rm=TRUE), pmax(y, x, na.rm=TRUE)))x <- as.integer(x); y <- as.integer(y)pmin(x, y)stopifnot(identical(pmin(x, y), pmin(y, x)))pmin(x, y, na.rm=TRUE)stopifnot(identical(pmin(x, y, na.rm=TRUE), pmin(y, x, na.rm=TRUE)))pmax(x, y)stopifnot(identical(pmax(x, y), pmax(y, x)))pmax(x, y, na.rm=TRUE)stopifnot(identical(pmax(x, y, na.rm=TRUE), pmax(y, x, na.rm=TRUE)))x <- as.character(x); y <- as.character(y)pmin(x, y)stopifnot(identical(pmin(x, y), pmin(y, x)))pmin(x, y, na.rm=TRUE)stopifnot(identical(pmin(x, y, na.rm=TRUE), pmin(y, x, na.rm=TRUE)))pmax(x, y)stopifnot(identical(pmax(x, y), pmax(y, x)))pmax(x, y, na.rm=TRUE)stopifnot(identical(pmax(x, y, na.rm=TRUE), pmax(y, x, na.rm=TRUE)))# tests of classed quantitiesx <- .leap.seconds[1:23]; y <- rev(x)x[2] <- y[2] <- x[3] <- y[4] <- NAformat(pmin(x, y), tz="GMT") # TZ names differ by platformclass(pmin(x, y))stopifnot(identical(pmin(x, y), pmin(y, x)))format(pmin(x, y, na.rm=TRUE), tz="GMT")stopifnot(identical(pmin(x, y, na.rm=TRUE), pmin(y, x, na.rm=TRUE)))format(pmax(x, y), tz="GMT")stopifnot(identical(pmax(x, y), pmax(y, x)))format(pmax(x, y, na.rm=TRUE), tz="GMT")stopifnot(identical(pmax(x, y, na.rm=TRUE), pmax(y, x, na.rm=TRUE)))x <- as.POSIXlt(x, tz="GMT"); y <- as.POSIXlt(y, tz="GMT")format(pmin(x, y), tz="GMT")class(pmin(x, y))stopifnot(identical(pmin(x, y), pmin(y, x)))format(pmin(x, y, na.rm=TRUE), tz="GMT")stopifnot(identical(pmin(x, y, na.rm=TRUE), pmin(y, x, na.rm=TRUE)))format(pmax(x, y), tz="GMT")stopifnot(identical(pmax(x, y), pmax(y, x)))format(pmax(x, y, na.rm=TRUE), tz="GMT")stopifnot(identical(pmax(x, y, na.rm=TRUE), pmax(y, x, na.rm=TRUE)))## regresion tests## regression tests on names of 1D arraysx <- as.array(1:3)names(x) <- letters[x] # sets dimnames, reallynames(x)dimnames(x)attributes(x)names(x) <- NULLattr(x, "names") <- LETTERS[x] # sets dimnames, reallynames(x)dimnames(x)attributes(x)## regression tests## regression tests on NA attribute namesx <- 1:3attr(x, "NA") <- 4attributes(x)attr(x, "NA")attr(x, NA_character_)try(attr(x, NA_character_) <- 5)## prior to 2.5.0 NA was treated as "NA"## qr with pivoting (PR#9623)A <- matrix(c(0,0,0, 1,1,1), nrow = 3,dimnames = list(letters[1:3], c("zero","one")))y <- matrix(c(6,7,8), nrow = 3, dimnames = list(LETTERS[1:3], "y"))qr.coef(qr(A), y)qr.fitted(qr(A), y)qr.coef(qr(matrix(0:1, 1, dimnames=list(NULL, c("zero","one")))), 5)## coef names were returned unpivoted <= 2.5.0## readChar read extra items, terminated on zerosx <- as.raw(65:74)readChar(x, nchar=c(3,3,0,3,3,3))f <- tempfile(tmpdir = getwd())writeChar("ABCDEFGHIJ", con=f, eos=NULL)readChar(f, nchar=c(3,3,0,3,3,3))unlink(f)#### corner cases for corset.seed(1)X <- cbind(NA, 1:3, rnorm(3))try(cor(X, use = "complete"))try(cor(X, use = "complete", method="spearman"))try(cor(X, use = "complete", method="kendall"))cor(X, use = "pair")cor(X, use = "pair", method="spearman")cor(X, use = "pair", method="kendall")X[1,1] <- 1cor(X, use = "complete")cor(X, use = "complete", method="spearman")cor(X, use = "complete", method="kendall")cor(X, use = "pair")cor(X, use = "pair", method="spearman")cor(X, use = "pair", method="kendall")## not consistent in 2.6.x## confint on rank-deficient models (in part, PR#10494)junk <- data.frame(x = rep(1, 10L),u = factor(sample(c("Y", "N"), 10, replace=TRUE)),ans = rnorm(10))fit <- lm(ans ~ x + u, data = junk)confint(fit)confint.default(fit)## Mismatch gave NA for 'u' in 2.6.1## corrupt data frame produced by subsetting (PR#10574)x <- data.frame(a=1:3, b=2:4)x[,3] <- xx## warning during printing < 2.7.0## format.factor used to lose dim[names] and names (PR#11512)x <- factor(c("aa", letters[-1]))dim(x) <- c(13,2)format(x, justify="right")#### removing columns in within (PR#1131)abc <- data.frame(a=1:5, b=2:6, c=3:7)within(abc, b<-NULL)within(abc,{d<-a+7;b<-NULL})within(abc,{a<-a+7;b<-NULL})## Second produced corrupt data frame in 2.7.1## aggregate on an empty data frame (PR#13167)z <- data.frame(a=integer(0), b=numeric(0))try(aggregate(z, by=z[1], FUN=sum))## failed in unlist in 2.8.0, now gives explicit message.aggregate(data.frame(a=1:10)[F], list(rep(1:2, each=5)), sum)## used to fail obscurely.## subsetting data frames with duplicate rowsz <- data.frame(a=1, a=2, b=3, check.names=FALSE)z[] # OKz[1, ]## had row names a, a.1, b in 2.8.0.## incorrect warning due to lack of fuzz.TS <- ts(co2[1:192], freq=24)tmp2 <- window(TS, start(TS), end(TS))## warned in 2.8.0## failed to add tagCall <- call("foo", 1)Call[["bar"]] <- 2Call## unnamed call in 2.8.1options(keep.source = TRUE)## $<- on pairlists failed to duplicate (from Felix Andrews,## https://stat.ethz.ch/pipermail/r-devel/2009-January/051698.html)foo <- function(given = NULL) {callObj <- quote(callFunc())if(!is.null(given)) callObj$given <- givenif (is.null(given)) callObj$default <- TRUEcallObj}foo()foo(given = TRUE)foo("blah blah")foo(given = TRUE)foo()## altered foo() in 2.8.1.## Using '#' flag in sprintf():forms <- c("%#7.5g","%#5.f", "%#7x", "%#5d", "%#9.0e")nums <- list(-3.145, -31, 0xabc, -123L, 123456)rbind(mapply(sprintf, forms, nums),mapply(sprintf, sub("#", '', forms), nums))## gave an error in pre-release versions of 2.9.0## (auto)printing of functions {with / without source attribute},## including primitivessink(con <- textConnection("of", "w")) ; c ; sink(NULL); close(con)of2 <- capture.output(print(c))stopifnot(identical(of2, of),identical(of2, "function (...) .Primitive(\"c\")"))## ^^ would have failed up to R 2.9.xfooprint(foo, useSource = FALSE)attr(foo, "srcref") <- NULLfoo(f <- structure(function(){}, note = "just a note",yada = function() "not the same"))print(f, useSource = TRUE)print(f, useSource = FALSE) # must print attributesprint.function <- function(x, ...) {cat("my print(<function>): "); str(x, give.attr=FALSE); invisible(x) }print.functionprint(print.function)rm(print.function)## auto-printing and printing differed up to R 2.9.x -- and then *AGAIN* in R 3.6.0## Make sure deparsing does not reset parametersprint(list(f, expression(foo), f, quote(foo), f, base::list, f),useSource = FALSE)printCoefmat(cbind(0,1))## would print NaN up to R 2.9.0## continuity correction for Kendall's tau. Improves this example.cor.test(c(1, 2, 3, 4, 5), c(8, 6, 7, 5, 3), method = "kendall",exact = TRUE)cor.test(c(1, 2, 3, 4, 5), c(8, 6, 7, 5, 3), method = "kendall",exact = FALSE)cor.test(c(1, 2, 3, 4, 5), c(8, 6, 7, 5, 3), method = "kendall",exact = FALSE, continuity = TRUE)# and a little for Spearman'scor.test(c(1, 2, 3, 4, 5), c(8, 6, 7, 5, 3), method = "spearman",exact = TRUE)cor.test(c(1, 2, 3, 4, 5), c(8, 6, 7, 5, 3), method = "spearman",exact = FALSE)cor.test(c(1, 2, 3, 4, 5), c(8, 6, 7, 5, 3), method = "spearman",exact = FALSE, continuity = TRUE)## Kendall case is wish of PR#13691## corrupt data frame, PR#13724foo <- matrix(1:12, nrow = 3)bar <- as.data.frame(foo)val <- integer(0)try(bar$NewCol <- val)# similar, not in the reporttry(bar[["NewCol"]] <- val)# [ ] is tricker, so just check the result is reasonable and printsbar["NewCol"] <- valbar[, "NewCol2"] <- valbar[FALSE, "NewCol3"] <- valbar## Succeeded but gave corrupt result in 2.9.0## Printing NA_complex_m22 <- matrix(list(NA_complex_, 3, "A string", NA_complex_), 2,2)print(m22)print(m22, na.print="<missing value>")## used uninitialized variable in C, noticably Windows, for R <= 2.9.0## non-standard variable names in update etc## never guaranteed to work, requested by Sundar Dorai-Raj in## https://stat.ethz.ch/pipermail/r-devel/2009-July/054184.htmlupdate(`a: b` ~ x, ~ . + y)## 2.9.1 dropped backticks## print(ls.str(.)) did evaluate callsE <- new.env(); E$cl <- call("print", "Boo !")ls.str(E)## 2.10.0 did print..## complete.cases with no inputtry(complete.cases())try(complete.cases(list(), list()))## gave unhelpful messages in 2.10.0, silly results in pre-2.10.1## error messages from (C-level) evalListtst <- function(y) { stopifnot(is.numeric(y)); y+ 1 }try(tst()) # even nicer since R 3.5.0's change to sequential stopifnot()try(c(1,,2))## change in 2.8.0 made these less clear## empty levels from cut.Date (cosmetic, PR#14162)x <- as.Date(c("2009-03-21","2009-03-31"))cut(x, breaks= "quarter") # had two levels in 2.10.1cut(as.POSIXlt(x), breaks= "quarter")## remove empty final level## tests of error conditions in switch()switch("a", a=, b=, c=, 4)switch("a", a=, b=, c=, ).Last.valueswitch("a", a=, b=, c=, invisible(4)).Last.value## visiblilty changed in 2.11.0## rounding error in aggregate.ts## https://stat.ethz.ch/pipermail/r-devel/2010-April/057225.htmlx <- rep(6:10, 1:5)aggregate(as.ts(x), FUN = mean, ndeltat = 5)x <- rep(6:10, 1:5)aggregate(as.ts(x), FUN = mean, nfrequency = 0.2)## platform-dependent in 2.10.1## wish of PR#9574a <- c(0.1, 0.3, 0.4, 0.5, 0.3, 0.0001)format.pval(a, eps=0.01)format.pval(a, eps=0.01, nsmall =2)## granted in 2.12.0## printing fractional datesas.Date(0.5, origin="1969-12-31")## changed to round down in 2.12.1## printing data frames with "" colnamesdfr <- data.frame(x=1:6, CC=11:16, f = gl(3,2)); colnames(dfr)[2] <- ""dfr## now prints the same as data.matrix(dfr) does here## format(., zero.print) --> prettyNum()set.seed(9); m <- matrix(local({x <- rnorm(40)sign(x)*round(exp(2*x))/10}), 8,5)noquote(format(m, zero.print= "."))## used to print ". 0" instead of ". "## tests of NA having precedence over NaN -- all must print "NA"min(c(NaN, NA))min(c(NA, NaN)) # NaN in 2.12.2min(NaN, NA_real_) # NaN in 2.12.2min(NA_real_, NaN)max(c(NaN, NA))max(c(NA, NaN)) # NaN in 2.12.2max(NaN, NA_real_) # NaN in 2.12.2max(NA_real_, NaN)## might depend on compiler < 2.13.0## PR#14514# Data are from Conover, "Nonparametric Statistics", 3rd Ed, p. 197,# re-arranged to make a lower-tail test the issue of relevance: we# want to see if pregnant nurses exposed to nitrous oxide have higher# rates of miscarriage, stratifying on the type of nurse.Nitrous <- array(c(32,210,8,26,18,21,3,3,7,75,0,10), dim = c(2,2,3),dimnames = list(c("Exposed","NotExposed"),c("FullTerm","Miscarriage"),c("DentalAsst","OperRoomNurse","OutpatientNurse")))mantelhaen.test(Nitrous, exact=TRUE, alternative="less")mantelhaen.test(Nitrous, exact=FALSE, alternative="less")## exact = FALSE gave the wrong tail in 2.12.2.## scan(strip.white=TRUE) could strip trailing (but not leading) space## inside quoted strings.writeLines(' " A "; "B" ;"C";" D ";"E "; F ;G ', "foo")cat(readLines("foo"), sep = "\n")scan('foo', list(""), sep=";")[[1]]scan('foo', "", sep=";")scan('foo', list(""), sep=";", strip.white = TRUE)[[1]]scan('foo', "", sep=";", strip.white = TRUE)unlink('foo')writeLines(' " A "\n "B" \n"C"\n" D "\n"E "\n F \nG ', "foo2")scan('foo2', "")scan('foo2', "", strip.white=TRUE) # documented to be ignored ...unlink('foo2')## Changed for 2.13.0, found when investigating non-bug PR#14522.## PR#14488: missing values in rank correlationsset.seed(1)x <- runif(10)y <- runif(10)x[3] <- NA; y[5] <- NAxy <- cbind(x, y)cor(x, y, method = "spearman", use = "complete.obs")cor(x, y, method = "spearman", use = "pairwise.complete.obs")cor(na.omit(xy), method = "spearman", use = "complete.obs")cor(xy, method = "spearman", use = "complete.obs")cor(xy, method = "spearman", use = "pairwise.complete.obs")## inconsistent in R < 2.13.0## integer overflow in rowsum() went undetected# https://stat.ethz.ch/pipermail/r-devel/2011-March/060304.htmlx <- 2e9Lrowsum(c(x, x), c("a", "a"))rowsum(data.frame(z = c(x, x)), c("a", "a"))## overflow in R < 2.13.0.## method dispatch in [[.data.frame:## https://stat.ethz.ch/pipermail/r-devel/2011-April/060409.htmld <- data.frame(num = 1:4,fac = factor(letters[11:14], levels = letters[1:15]),date = as.Date("2011-04-01") + (0:3),pv = package_version(c("1.2-3", "4.5", "6.7", "8.9-10")))for (i in seq_along(d)) print(d[[1, i]])## did not dispatch in R < 2.14.0## some tests of 24:00 as midnightas.POSIXlt("2011-05-16 24:00:00", tz = "GMT")as.POSIXlt("2010-01-31 24:00:00", tz = "GMT")as.POSIXlt("2011-02-28 24:00:00", tz = "GMT")as.POSIXlt("2008-02-28 24:00:00", tz = "GMT")as.POSIXlt("2008-02-29 24:00:00", tz = "GMT")as.POSIXlt("2010-12-31 24:00:00", tz = "GMT")## new in 2.14.0## Unwarranted conversion of logical valuestry(double(FALSE))x <- 1:3try(length(x) <- TRUE)## coerced to integer in 2.13.x## filter(recursive = TRUE) on input with NAs# https://stat.ethz.ch/pipermail/r-devel/2011-July/061547.htmlx <- c(1:4, NA, 6:9)cbind(x, "1"=filter(x, 0.5, method="recursive"),"2"=filter(x, c(0.5, 0.0), method="recursive"),"3"=filter(x, c(0.5, 0.0, 0.0), method="recursive"))## NAs in wrong place in R <= 2.13.1.## PR#14679. Format depends if TZ is set.x <- as.POSIXlt(c("2010-02-27 22:30:33", "2009-08-09 06:01:03","2010-07-23 17:29:59"))stopifnot(!is.na(trunc(x, units = "days")[1:3]))## gave NAs after the first in R < 2.13.2## explicit error message for silly input (tol = 0)aa <- c(1, 2, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 13, 14)try(smooth.spline(aa, seq_along(aa)))fit <- smooth.spline(aa, seq_along(aa), tol = 0.1)# actual output is too unstable to diff.## Better message from R 2.14.2## PR#14840d <- data.frame(x = 1:9,y = 1:9 + 0.1*c(1, 2, -1, 0, 1, 1000, 0, 1, -1),w = c(1, 0.5, 2, 1, 2, 0, 1, 2, 1))fit <- lm(y ~ x, data=d, weights=w)summary(fit)## issue is how the 5-number summary is labelled## (also seen in example(case.names))## is.unsorted got it backwards for dataframes of more than one column## it is supposed to look for violations of x[2] > x[1], x[3] > x[2], etc.is.unsorted(data.frame(x=2:1))is.unsorted(data.frame(x=1:2, y=3:4))is.unsorted(data.frame(x=3:4, y=1:2))## R < 2.15.1 got these as FALSE, TRUE, FALSE.library("methods")# (not needed here)assertError <- tools::assertErrorassertErrorV <- function(expr) assertError(expr, verbose=TRUE)assertErrorV( getMethod(ls, "bar", fdef=ls) )assertErrorV( getMethod(show, "bar") )## R < 2.15.1 gave## cannot coerce type 'closure' to vector of type 'character'## corner cases for array# allowed, gave non-array in 2.15.xtry(array(1, integer()))# if no dims, an error to supply dimnamestry(array(1, integer(), list(1, 2)))#### is.na() on an empty dataframe (PR#14059)DF <- data.frame(row.names=1:3)is.na(DF); str(.Last.value)is.na(DF[FALSE, ]); str(.Last.value)## first failed in R 2.15.1, second gave NULL## split() with dots in levelsdf <- data.frame(x = rep(c("a", "a.b"), 3L), y = rep(c("b.c", "c"), 3L),z = 1:6)dfsplit(df, df[, 1:2]) # default is sep = "."split(df, df[, 1:2], sep = ":")#### The difference between sort.list and orderz <- c(4L, NA, 2L, 3L, NA, 1L)order(z, na.last = NA)sort.list(z, na.last = NA)sort.list(z, na.last = NA, method = "shell")sort.list(z, na.last = NA, method = "quick")sort.list(z, na.last = NA, method = "radix")## Differences first documented in R 2.15.2## PR#15028: names longer than cutoff NB (= 1000)NB <- 1000lns <- capture.output(setNames(c(255, 1000, 30000),c(paste(rep.int("a", NB+2), collapse=""),paste(rep.int("b", NB+2), collapse=""),paste(rep.int("c", NB+2), collapse=""))))sub("^ +", '', lns[2* 1:3])## *values* were cutoff when printed## allows deparse limits to be setform <- reallylongnamey ~ reallylongnamex0 + reallylongnamex1 + reallylongnamex2 + reallylongnamex3formop <- options(deparse.cutoff=80)formoptions(deparse.cutoff=50)formoptions(op)## fixed to 60 in R 2.15.x## PR#15179: user defined binary ops were not deparsed properlyquote( `%^%`(x, `%^%`(y,z)) )quote( `%^%`(x) )#### Anonymous function calls were not deparsed properlysubstitute(f(x), list(f = function(x) x + 1))substitute(f(x), list(f = quote(function(x) x + 1)))substitute(f(x), list(f = quote(f+g)))substitute(f(x), list(f = quote(base::mean)))substitute(f(x), list(f = quote(a[n])))substitute(f(x), list(f = quote(g(y))))## The first three need parens, the last three don't.## PR#15247 : str() on invalid data frame names (where print() works):d <- data.frame(1:3, "B", 4, stringsAsFactors=TRUE)names(d) <- c("A", "B\xba","C\xabcd")str(d)## gave an error in R <= 3.0.0## PR#15299 : adding a simple vector to a classed object produced a bad result:1:2 + table(1:2)## Printed the class attribute in R <= 3.0.0## PR#15311 : regmatches<- mishandled regexpr results.x <- c('1', 'B', '3')m <- regexpr('\\d', x)regmatches(x, m) <- c('A', 'C')print(x)## Gave a warning and a wrong result up to 3.0.1## Bad warning found by Radford Nealsaveopt <- options(warnPartialMatchDollar=TRUE)pl <- pairlist(abc=1, def=2)pl$abif (!is.null(saveopt[["warnPartialMatchDollar"]])) options(saveopt)## 'abc' was just ''## seq() with NaN etc inputs now gives explicit error messagestry(seq(NaN))try(seq(to = NaN))try(seq(NaN, NaN))try(seq.int(NaN))try(seq.int(to = NaN))try(seq.int(NaN, NaN))## R 3.0.1 gave messages from ':' or about negative-length vectors.## Some dimnames were lost from 1D arrays: PR#15301x <- array(0:2, dim=3, dimnames=list(d1=LETTERS[1:3]))xx[]x[3:1]x <- array(0, dimnames=list(d1="A"))xx[]x[drop = FALSE]## lost dimnames in 3.0.1## PR#15396load(file.path(Sys.getenv('SRCDIR'), 'arima.rda'))(f1 <- arima(x, xreg = xreg, order = c(1,1,1), seasonal = c(1,0,1)))(f2 <- arima(diff(x), xreg = diff(xreg), order = c(1,0,1), seasonal = c(1,0,1),include.mean = FALSE))stopifnot(all.equal(coef(f1), coef(f2), tolerance = 1e-3, check.names = FALSE))## first gave local optim in 3.0.1## all.equal always checked the namesx <- c(a=1, b=2)y <- c(a=1, d=2)all.equal(x, y, check.names = FALSE)## failed on mismatched attributes## PR#15411, plus digits changeformat(9992, digits = 3)format(9996, digits = 3)format(0.0002, digits = 0, nsmall = 2)format(pi*10, digits = 0, nsmall = 1)## second added an extra space; 3rd and 4th were not allowed.## and one branch of this was wrong:xx <- c(-86870268, 107833358, 302536985, 481015309, 675718935, 854197259,1016450281, 1178703303, 1324731023, 1454533441)xx## dropped spaces without long doubles## and rounding was being detected improperly (PR#15583)1000* ((10^(1/4)) ^ c(0:4))7/0.07## Spacing was incorrect## PR#15468M <- matrix(11:14, ncol=2, dimnames=list(paste0("Row", 1:2), paste0("Col",1:2)))L <- list(elem1=1, elem2=2)rbind(M, L)rbind(L, M)cbind(M, L)cbind(L, M)## lost the dim of M, so returned NULL entries## NA_character_ was not handled properly in min and max (reported by Magnus Thor Torfason)str(min(NA, "bla"))str(min("bla", NA))str(min(NA_character_, "bla"))str(max(NA, "bla"))str(max("bla", NA))str(max(NA_character_, "bla"))## NA_character_ could be treated as "NA"; depending on the locale, it would not necessarily## be the min or max.## When two entries needed to be cut to width, str() mixed up## the values (reported by Gerrit Eichner)oldopts <- options(width=70)n <- 11 # number of rows of data frameM <- 10000 # order of magnitude of numerical valueslonger.char.string <- "zjtvorkmoydsepnxkabmeondrjaanutjmfxlgzmrbjp"X <- data.frame( A = 1:n * M,B = factor(rep(longer.char.string, n)))str( X, strict.width = "cut")options(oldopts)## The first row of the str() result was duplicated.## PR15624: rounding in extreme casesdpois(2^52,1,1)dpois(2^52+1,1,1)## second warned in R 3.0.2.## Example from PR15625f <- file.path(Sys.getenv('SRCDIR'), 'EmbeddedNuls.csv')## This is a file with a UTF-8 BOM and some fields which are a single nul.## The output does rely on this being run in a non-UTF-8 locale (C in tests).read.csv(f) # warnsread.csv(f, skipNul = TRUE, fileEncoding = "UTF-8-BOM")## 'skipNul' is new in 3.1.0. Should not warn on BOM, ignore in second.## all.equal datetime methodx <- Sys.time()all.equal(x,x)all.equal(x, as.POSIXlt(x))all.equal(x, as.POSIXlt(x, tz = "EST5EDT"))all.equal(x, x+1e-4)isTRUE(all.equal(x, x+0.002)) # message will depend on representation error## as.POSIXt method is new in 3.1.0.## Misuse of PR#15633try(bartlett.test(yield ~ block*N, data = npk))try(fligner.test (yield ~ block*N, data = npk))## used the first factor with an incorrect description in R < 3.0.3## Misguided expectation of PR#15687xx <- window(AirPassengers, start = 1960)cbind(xx, xx)op <- options(digits = 2)cbind(xx, xx)options(op)## 'digits' was applied to the time.## Related to PR#15190difftime(as.POSIXct(c("1970-01-01 00:00:00", "1970-01-01 12:00:00"), tz="EST5EDT"),as.POSIXct(c("1970-01-01 00:00:00", "1970-01-01 00:00:00"), tz="UTC"))## kept tzone from first arg.## PR#15706x1 <- as.dendrogram(hclust(dist(c(i=1,ii=2,iii=3,v=5,vi=6,vii=7))))attr(cophenetic(x1), "Labels")## gave a matrix in 3.0.3## PR#15708aa <- anova( lm(sr ~ ., data = LifeCycleSavings) )op <- options(width = 50)aaoptions(width = 40)aa ; options(op)## did not line wrap "Signif. codes" previously## PR#15718d <- data.frame(a=1)d[integer(), "a"] <- 2## warned in 3.0.3.## PR#15781options(foo = 1)print(options(foo = NULL))## printed wrong value in 3.1.0## getParseData bug reported by Andrew Reddraw <- "function( a # parameter 1, b=2 # parameter 2){a+b}"p <- parse(text = raw)getParseData(p)## Got some parents wrong## wish of PR#15819set.seed(123); x <- runif(10); y <- rnorm(10)op <- options(OutDec = ",")fit <- lm(y ~ x)summary(fit)options(op)## those parts using formatC still used a decimal point.## Printing a list with "bad" component namesL <- list(`a\\b` = 1, `a\\c` = 2, `a\bc` = "backspace")setClass("foo", representation(`\\C` = "numeric"))## the next three all print correctly:names(L)unlist(L)as.pairlist(L)cat(names(L), "\n")# yes, backspace is backspace hereLnew("foo")## the last two lines printed wrongly in R <= 3.1.1## Printing of arrays where last dim(.) == 0 :r <- matrix(,0,4, dimnames=list(Row=NULL, Col=paste0("c",1:4)))rt(r) # did not print "Row", "Col"A <- array(dim=3:0, dimnames=list(D1=c("a","b","c"), D2=c("X","Y"), D3="I", D4=NULL))A ## did not print *anything*A[,,"I",] # dittoA[,,0,] # dittoaperm(A, c(3:1,4)) # dittoaperm(A, c(1:2, 4:3))# dittounname(A) # dittoformat(A[,,1,]) # dittoaperm(A, 4:1) # was ok, is unchanged## sometimes not printing anything in R <= 3.1.1## Printing objects with very long names cut off literal values (PR#15999)make_long_name <- function(n){paste0(rep("a", n), collapse = "")}setNames(TRUE, make_long_name(1000)) # value printed as TRUsetNames(TRUE, make_long_name(1002)) # value printed as TsetNames(TRUE, make_long_name(1003)) # value not printed#### PR#16437dd <- data.frame(F = factor(rep(c("A","B","C"), each = 3)), num = 1:9)cs <- list(F = contr.sum(3, contrasts = FALSE))a1 <- aov(num ~ F, data = dd, contrasts = cs)model.tables(a1, "means")t1 <- TukeyHSD(a1) ## don't print to avoid precision issues.a2 <- aov(num ~ 0+F, data = dd, contrasts = cs)model.tables(a2, "means")t2 <- TukeyHSD(a2)attr(t1, "orig.call") <- attr(t2, "orig.call")stopifnot(all.equal(t1, t2))## functions both failed on a2 in R <= 3.2.2.## deparse() did not add parens before [substitute(a[1], list(a = quote(x * y)))## should be (x * y)[1], was x * y[1]# Check all levels of precedence# (Comment out illegal ones)quote(`$`(a :: b, c))# quote(`::`(a $ b, c $ d))quote(`[`(a $ b, c $ d))quote(`$`(a[b], c))quote(`^`(a[b], c[d]))quote(`[`(a ^ b, c ^ d))quote(`-`(a ^ b))quote(`^`(-b, -d))quote(`:`(-b, -d))quote(`-`(a : b))quote(`%in%`(a : b, c : d))quote(`:`(a %in% b, c %in% d))quote(`*`(a %in% b, c %in% d))quote(`%in%`(a * b, c * d))quote(`+`(a * b, c * d))quote(`*`(a + b, c + d))quote(`<`(a + b, c + d))quote(`+`(a < b, c < d))quote(`!`(a < b))quote(`<`(!b, !d))quote(`&`(!b, !d))quote(`!`(a & b))quote(`|`(a & b, c & d))quote(`&`(a | b, c | d))quote(`~`(a | b, c | d))quote(`|`(a ~ b, c ~ d))quote(`->`(a ~ b, d))quote(`~`(a -> b, c -> d))quote(`<-`(a, c -> d))quote(`->`(a <- b, c))quote(`=`(a, c <- d))quote(`<-`(a, `=`(c, d)))quote(`?`(`=`(a, b), `=`(c, d)))quote(`=`(a, c ? d))quote(`?`(a = b))quote(`=`(b, ?d))## dput() quoted the empty symbol (PR#16686)a <- alist(one = 1, two = )dput(a)## deparsed two to quote()## Deparsing of repeated unary operators; the first 3 were "always" ok:quote(~~x)quote(++x)quote(--x)quote(!!x) # was `!(!x)`quote(??x) # Suboptimalquote(~+-!?x) # ditto: ....`?`(x)## `!` no longer produces parentheses now## summary.data.frame() with NAs in columns of class "Date" -- PR#16709x <- c(18000000, 18810924, 19091227, 19027233, 19310526, 19691228, NA)x.Date <- as.Date(as.character(x), format = "%Y%m%d")summary(x.Date)DF.Dates <- data.frame(c1 = x.Date)summary(DF.Dates) ## NA's missing from output :DF.Dates$x1 <- 1:7summary(DF.Dates) ## NA's still missingDF.Dates$x2 <- c(1:6, NA)## now, NA's show fine:summary(DF.Dates)## 2 of 4 summary(.) above did not show NA's in R <= 3.2.3## Printing complex matrixmatrix(1i,2,13)## Spacing was wrong in R <= 3.2.4E <- expression(poly = x^3 - 3 * x^2)str(E)## no longer shows "structure(...., .Names = ..)"## summary(<logical>) working via table():logi <- c(NA, logical(3), NA, !logical(2), NA)summary(logi)summary(logi[!is.na(logi)])summary(TRUE)## was always showing counts for NA's even when 0 in 2.8.0 <= R <= 3.3.1ii <- as.integer(logi)summary(ii)summary(ii[!is.na(ii)])summary(1L)## str.default() for "AsIs" arraysstr(I(m <- matrix(pi*1:4, 2)))## did look ugly (because of toString() for numbers) in R <= 3.3.1## check automatic coercions from double to integer#### these should work due to coercionsprintf("%d", 1)sprintf("%d", NA_real_)sprintf("%d", c(1,2))sprintf("%d", c(1,NA))sprintf("%d", c(NA,1))#### these should failassertErrorV( sprintf("%d", 1.1) )assertErrorV( sprintf("%d", c(1.1,1)) )assertErrorV( sprintf("%d", c(1,1.1)) )assertErrorV( sprintf("%d", NaN) )assertErrorV( sprintf("%d", c(1,NaN)) )## formatting of named raws:setNames(as.raw(1:3), c("a", "bbbb", "c"))## was quite ugly for R <= 3.4.2## str(x) when is.vector(x) is false :str(structure(c(a = 1, b = 2:7), color = "blue"))## did print " atomic [1:7] ..." in R <= 3.4.x## check stopifnot(exprs = ....)tryCatch(stopifnot(exprs = {all.equal(pi, 3.1415927)2 < 2cat("Kilroy was here!\n")all(1:10 < 12)"a" < "b"}), error = function(e) e$message) -> M ; cat("Error: ", M, "\n")tryCatch(stopifnot(exprs = {all.equal(pi, 3.1415927){ cat("Kilroy was here!\n"); TRUE }pi < 3cat("whereas I won't be printed ...\n")all(1:10 < 12)"a" < "b"}), error = function(e) e$message) -> M2 ; cat("Error: ", M2, "\n")stopifnot(exprs = {all.equal(pi, 3.1415927){ cat("\nKilroy was here! ... "); TRUE }pi > 3all(1:10 < 12)"a" < "b"{ cat("and I'm printed as well ...\n"); TRUE}})## without "{ .. }" :stopifnot(exprs = 2 == 2)try(stopifnot(exprs = 1 > 2))## passing an expression object:stopifnot(exprObject = expression(2 == 2, pi < 4))tryCatch(stopifnot(exprObject = expression(2 == 2,{ cat("\n Kilroy again .."); TRUE },pi < 4,0 == 1,{ cat("\n no way..\n"); TRUE })),error = function(e) e$message) -> M3cat("Error: ", M3, "\n")## was partly not ok for many weeks in R-devel, early 2018## print.htest() with small 'digits'print(t.test(1:28), digits = 3)## showed 'df = 30' from signif(*, digits=1) and too many digits for CI, in R <= 3.5.1## str(<d.frame w/ attrib>):treeA <- treesattr(treeA, "someA") <- 1:77str(treeA)## now shows the *length* of "someA"## summaryRprof() bug PR#15886 + "Rprof() not enabled" PR#17836if(capabilities("Rprof")) {Rprof(tf <- tempfile("Rprof.out", tmpdir = getwd()), memory.profiling=TRUE, line.profiling=FALSE)out <- lapply(1:10000, rnorm, n= 512)Rprof(NULL)if(interactive())print(length(readLines(tf))) # ca. 10 .. 20 linesop <- options(warn = 2) # no warnings, even !for (cs in 1:21) s <- summaryRprof(tf, memory="tseries", chunksize=cs)options(op) ## "always" triggered an error (or a warning) in R <= 3.6.3}