
R Under development (unstable) (2022-03-19 r81942) -- "Unsuffered Consequences"
Copyright (C) 2022 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 
> inherits(try(parse(text = "12iL"), silent=TRUE), "try-error") # gives syntax error
[1] TRUE
> 
> 
> 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
> 
> 
