
R version 3.6.2 Patched (2020-02-12 r77795) -- "Dark and Stormy Night"
Copyright (C) 2020 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> ###---- ALL tests here should return  TRUE !
> ###
> ###---- "Real" Arithmetic; Numerics etc  -->  ./arith-true.R
> 
> ### mode checking, etc.
> is.recursive(expression(1+3, 2/sqrt(pi)))# fix PR#9
[1] TRUE
> 
> ## sum():
> all(1:12 == cumsum(rep(1,12)))
[1] TRUE
> x <- rnorm(127); sx <- sum(x);	abs((sum(rev(x)) -sx)) < 1e-12 * abs(sx)
[1] TRUE
> 
> ## seq():
> typeof(1:4) == "integer" #-- fails for 0.2, 0.3,.., 0.9
[1] TRUE
> 
> ## Check parsing with L suffix for integer literals.
> typeof(1L) == "integer"
[1] TRUE
> typeof(1000L) == "integer"
[1] TRUE
> typeof(1e3L) == "integer"
[1] TRUE
> typeof(1e-3L) == "double" # gives warning
[1] TRUE
Warning message:
non-integer value 1e-3L qualified with L; using numeric value 
> 1.L # gives warning
[1] 1
Warning message:
integer literal 1.L contains unnecessary decimal point 
> try(parse(text = "12iL")) # gives syntax error
Error in parse(text = "12iL") : <text>:1:4: unexpected symbol
1: 12iL
       ^
> 
> 
> all((0:6) == pi + ((-pi):pi))
[1] TRUE
> all((0:7) == (pi+seq(-pi,pi, length=8))*7/(2*pi))
[1] TRUE
> 
> 1 == as.integer(is.na(c(pi,NA)[2]))
[1] TRUE
> 1 == as.integer(is.nan(0/0))
[1] TRUE
> 
> ## rev():
> cc <- c(1:10,10:1) ;		all(cc == rev(cc))
[1] TRUE
> 
> ## dim[names]():
> all(names(c(a=pi, b=1, d=1:4)) == c("a","b", paste("d", 1:4, sep="")))
[1] TRUE
> ##P names(c(a=pi, b=1, d=1:4))
> ncb <- dimnames(cbind(a=1, yy=1:3))[[2]]
> (!is.null(ncb)) && all(ncb == c("a","yy"))
[1] TRUE
> 
> all(cbind(a=1:2, b=1:3, c=1:6) == t(rbind(a=1:2, b=1:3, c=1:6)))
[1] TRUE
> ##P rbind(a=1:2, b=1:3, c=1:6)
> all(dim(cbind(cbind(I=1,x=1:4), c(a=pi))) == 4:3)# fails in S+
[1] TRUE
> 
> a <- b <- 1:3
> all(dimnames(cbind(a, b))[[2]] == c("a","b"))
[1] TRUE
> 
> ## rbind PR#338
> all(dim(m <- rbind(1:2, diag(2))) == 3:2)
[1] TRUE
> all(m == c(1,1,0, 2,0,1))
[1] TRUE
> 
> ## factor():
> is.factor(factor(integer()))
[1] TRUE
> all(levels(ordered(rev(gl(3,4)))) == 1:3)# coercion to char
[1] TRUE
> all(levels(factor(factor(9:1)[3:5])) == 5:7)
[1] TRUE
> ## crossing bug PR#40
> is.factor(ff <- gl(2,3) : gl(3,2)) && length(ff) == 6
[1] TRUE
> all(levels(ff) == t(outer(1:2, 1:3, paste, sep=":")))
[1] TRUE
> ## from PR#5
> ll <- c("A","B"); ff <- factor(ll); f0 <- ff[, drop=TRUE]
> all(f0 == ff) && all(levels(ff) == ll) && is.factor(ff) && is.factor(f0)
[1] TRUE
> 
> ### data.frame s :
> 
> ## from lists [bug PR#100]
> x <- NULL
> x$x1 <- 1:10
> x$x2 <- 0:9
> all(dim(dx <- as.data.frame(x)) == c(10,2))
[1] TRUE
> 
> ## Logicals: (S is wrong)
> l1 <- c(TRUE,FALSE,TRUE)
> (! as.logical(as.data.frame(FALSE)[,1]))
[1] TRUE
> all(l1 == as.logical(as.data.frame(l1)[,1]))
[1] TRUE
> 
> ## empty data.frames :
> x <- data.frame(a=1:3)
> x30 <- {
+     if(is.R()) x[, -1]# not even possible in S+
+     else structure(list(), row.names = paste(1:3), class = "data.frame")
+ }
> all(dim(x30) == c(3,0))
[1] TRUE
> x01 <- x[-(1:3), , drop = FALSE]
> x00 <- x01[,-1]
> all(dim(x01) == 0:1)
[1] TRUE
> all(dim(x00) == 0)
[1] TRUE
> all(dim(x) == dim(rbind(x, x01)))
[1] TRUE
> ## bugs up to 1.2.3 :
> all(dim(x30) == dim(m30 <- as.matrix(x30)))
[1] TRUE
> all(dim(x01) == dim(m01 <- as.matrix(x01)))
[1] TRUE
> all(dim(x30) == dim(as.data.frame(m30)))
[1] TRUE
> all(dim(x01) == dim(as.data.frame(m01)))
[1] TRUE
> all(dim(x01) == dim(   data.frame(m01)))
[1] TRUE
> all(dim(x30) == dim(   data.frame(m30)))
[1] TRUE
> all(dim(x)   == dim(cbind(x, x30)))
[1] TRUE
> ## up to 1.4.0 :
> all(dim(x30) == dim( data.matrix(x30)))
[1] TRUE
> all(dim(x00) == dim( data.matrix(x00)))
[1] TRUE
> 
> m0 <- matrix(pi, 0,3)
> a302 <- array("", dim=c(3,0,2))
> identical(apply(m0, 1, dim), NULL)
[1] TRUE
> identical(apply(m0, 2, dim), NULL)
[1] TRUE
> identical(apply(m0, 1,length),  integer(0))
[1] TRUE
> identical(apply(m0, 2,length),  integer(3))
[1] TRUE
> identical(apply(a302, 1, mode), rep("character",3))
[1] TRUE
> ## NO (maybe later?):
> ## identical(apply(a302, 2, mode), rep("character",0))
> is.character(aa <- apply(a302, 2, mode)) && length(aa) == 0
[1] TRUE
> identical(apply(a302, 3, mode), rep("character",2))
[1] TRUE
> identical(apply(a302, 3, length),integer(2))
[1] TRUE
> identical(apply(a302, 3, dim), matrix(as.integer(c(3,0)), 2 ,2))
[1] TRUE
> identical(apply(a302, 1, dim), matrix(as.integer(c(0,2)), 2 ,3))
[1] TRUE
> identical(apply(array(dim=3), 1,length), rep(1:1, 3))
[1] TRUE
> identical(apply(array(dim=0), 1,length), rep(1:1, 0))# = integer(0)
[1] TRUE
> 
> 
> ### Subsetting
> 
> ## bug PR#425
> x <- matrix(1:4, 2, 2, dimnames=list(c("abc","ab"), c("cde","cd")))
> y <- as.data.frame(x)
> all(x["ab",] == c(2,4))
[1] TRUE
> all(y["ab",] == c(2,4))
[1] TRUE
> 
> ## from bug PR#447
> x <- 1:2 ; x[c("2","2")] <- 4
> all.equal(x, c(1:2, "2" = 4))
[1] TRUE
> 
> ## stretching
> l2 <- list(a=1, b=2)
> l2["cc"] <- pi
> l2[["d"]] <- 4
> l2 $ e <- 55
> all.equal(l2, list(a = 1, b = 2, cc = pi, d = 4, e = 55), tolerance = 0)
[1] TRUE
> all.equal(l2["d"], list(d = 4))
[1] TRUE
> l2$d == 4 && l2$d == l2[["d"]]
[1] TRUE
> 
> ## bug in R <= 1.1
> f1 <- y1 ~ x1
> f2 <- y2 ~ x2
> f2[2] <- f1[2]
> deparse(f2) == "y1 ~ x2"
[1] TRUE
> 
> m <- cbind(a=1:2,b=c(R=10,S=11))
> all(sapply(dimnames(m), length) == c(2,2))
[1] TRUE
> ## [[ for matrix:
> m[[1,2]] == m[[3]] && m[[3]] == m[3] && m[3] == m[1,2]
[1] TRUE
> 
> ## bug in R <= 1.1.1 : unclass(*) didn't drop the class!
> ## to be robust to S4 methods DON'T test for null class
> ## The test for attr(,"class") is valid, if essentially useless
> d1 <- rbind(data.frame(a=1, b = I(TRUE)), new = c(7, "N"))
> is.null(attr(unclass(d1$b), "class"))
[1] TRUE
> 
> ## bugs in R 1.2.0
> format(as.POSIXct(relR120 <- "2000-12-15 11:24:40")) == relR120
[1] TRUE
> format(as.POSIXct(substr(relR120,1,10))) == substr(relR120,1,10)
[1] TRUE
> 
> ## rank() with NAs (and ties)
> x <- c(3:1,6,4,3,NA,5,0,NA)
> rx <-  rank(x)
> all(rx == c(4.5, 3:2, 8, 6, 4.5, 9, 7, 1, 10))
[1] TRUE
> rxK <- rank(x, na.last = "keep")
> all(rx [rx <= 8]    == na.omit(rxK))
[1] TRUE
> all(rank(x, na.last = NA) == na.omit(rxK))
[1] TRUE
> 
> ## as.list.function() instead of *.default():
> identical(as.list(as.list),
+ 	  alist(x = , ... = , UseMethod("as.list")))
[1] TRUE
> 
> ## startsWith() / endsWith()  assertions
> t1 <- c("Foobar", "bla bla", "something", "another", "blu", "brown",
+         "blau blüht der Enzian")# non-ASCII
> t2 <- c("some text", "any text")
> t3 <- c("Martin", "Zürich", "Mächler")
> 
> all(endsWith(t1, "")); all(startsWith(t1, ""))
[1] TRUE
[1] TRUE
> all(endsWith(t2, "")); all(startsWith(t2, ""))
[1] TRUE
[1] TRUE
> all(endsWith(t3, "")); all(startsWith(t3, ""))
[1] TRUE
[1] TRUE
> all(endsWith(t2, "text"))
[1] TRUE
> all(endsWith(t2, " text"))
[1] TRUE
> identical(startsWith(t1, "b" ), c(FALSE, TRUE, FALSE, FALSE, TRUE,  TRUE, TRUE))
[1] TRUE
> identical(startsWith(t1, "bl"), c(FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE))
[1] TRUE
> identical(startsWith(t1, "bla"),c(FALSE, TRUE, FALSE, FALSE,FALSE, FALSE, TRUE))
[1] TRUE
> identical(  endsWith(t1, "n"),  c(FALSE,FALSE, FALSE, FALSE,FALSE,  TRUE, TRUE))
[1] TRUE
> identical(  endsWith(t1, "an"), c(FALSE,FALSE, FALSE, FALSE,FALSE, FALSE, TRUE))
[1] TRUE
> ##
> identical(startsWith(t3, "M" ), c( TRUE, FALSE, TRUE))
[1] TRUE
> identical(startsWith(t3, "Ma"), c( TRUE, FALSE, FALSE))
[1] TRUE
> identical(startsWith(t3, "Mä"), c(FALSE, FALSE, TRUE))
[1] TRUE
> 
> 
