
R version 2.4.0 Under development (unstable) (2006-06-09 r38316)
Copyright (C) 2006 The R Foundation for Statistical Computing
ISBN 3-900051-07-0

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.

> ## tests of boundary cases in read.table()
> 
> ## force standard handling for character cols
> options(stringsAsFactors=TRUE)
> 
> # empty file
> file.create("foo1")
[1] TRUE
> try(read.table("foo1")) # fails
Error in read.table("foo1") : no lines available in input
> read.table("foo1", col.names=LETTERS[1:4])
[1] A B C D
<0 rows> (or 0-length row.names)
> unlink("foo1")
> 
> # header only
> cat("head\n", file = "foo2")
> read.table("foo2")
    V1
1 head
> try(read.table("foo2", header=TRUE)) # fails in 1.2.3
[1] head
<0 rows> (or 0-length row.names)
> unlink("foo2")
> # header detection
> cat("head\n", 1:2, "\n", 3:4, "\n", file = "foo3")
> read.table("foo3", header=TRUE)
  head
1    2
3    4
> read.table("foo3", header=TRUE, col.names="V1")
  V1
1  2
3  4
> read.table("foo3", header=TRUE, row.names=1)
  head
1    2
3    4
> read.table("foo3", header=TRUE, row.names="row.names")
  head
1    2
3    4
> read.table("foo3", header=TRUE, row.names="head") # fails in 1.2.3
  row.names
2         1
4         3
> 
> # wrong col.names
> try(read.table("foo3", header=TRUE, col.names=letters[1:4]))
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
	line 1 did not have 4 elements
In addition: Warning message:
header and 'col.names' are of different lengths in: read.table("foo3", header = TRUE, col.names = letters[1:4]) 
> unlink("foo3")
> 
> # incomplete last line
> cat("head\n", 1:2, "\n", 3:4, file = "foo4")
> read.table("foo4", header=TRUE)
  head
1    2
3    4
Warning message:
incomplete final line found by readTableHeader on 'foo4' 
> unlink("foo4")
> 
> # blank last line
> cat("head\n\n", 1:2, "\n", 3:4, "\n\n", file = "foo5")
> read.table("foo5", header=TRUE)
  head
1    2
3    4
> 
> # test of fill
> read.table("foo5", header=FALSE, fill=TRUE, blank.lines.skip=FALSE) # fails in 1.2.3
    V1 V2
1 head NA
2      NA
3    1  2
4    3  4
5      NA
> unlink("foo5")
> 
> cat("head\n", 1:2, "\n", 3:5, "\n", 6:9, "\n", file = "foo6")
> try(read.table("foo6", header=TRUE))
Error in read.table("foo6", header = TRUE) : 
	more columns than column names
> try(read.table("foo6", header=TRUE, fill=TRUE))
Error in read.table("foo6", header = TRUE, fill = TRUE) : 
	more columns than column names
> read.table("foo6", header=FALSE, fill=TRUE)
    V1 V2 V3 V4
1 head NA NA NA
2    1  2 NA NA
3    3  4  5 NA
4    6  7  8  9
> unlink("foo6")
> 
> # test of type conversion in 1.4.0 and later.
> cat("A B C D E F\n",
+     "1 1 1.1 1.1+0i NA F abc\n",
+     "2 NA NA NA NA NA NA\n",
+     "3 1 2 3 NA TRUE def\n",
+     sep = "", file = "foo7")
> (res <- read.table("foo7"))
   A   B       C  D     E    F
1  1 1.1  1.1+0i NA FALSE  abc
2 NA  NA      NA NA    NA <NA>
3  1 2.0  3.0+0i NA  TRUE  def
> sapply(res, typeof)
        A         B         C         D         E         F 
"integer"  "double" "complex" "logical" "logical" "integer" 
> sapply(res, class)
        A         B         C         D         E         F 
"integer" "numeric" "complex" "logical" "logical"  "factor" 
> (res2 <- read.table("foo7",
+                     colClasses = c("character", rep("numeric", 2),
+                     "complex", "integer", "logical", "character")))
   A   B       C  D     E    F
1  1 1.1  1.1+0i NA FALSE  abc
2 NA  NA      NA NA    NA <NA>
3  1 2.0  3.0+0i NA  TRUE  def
> sapply(res2, typeof)
          A           B           C           D           E           F 
   "double"    "double"   "complex"   "integer"   "logical" "character" 
> sapply(res2, class)
          A           B           C           D           E           F 
  "numeric"   "numeric"   "complex"   "integer"   "logical" "character" 
> unlink("foo7")
> 
> # should be logical
> type.convert(character(0))
logical(0)
> 
> # test of comments in data files
> cat("# a test file",
+     "# line 2",
+     "# line 3",
+     "#line 4",
+     "# line 5",
+     "## now the header",
+     " a b c",
+     "# some more comments",
+     "1 2 3",
+     "4 5 6# this is the second data row of the file",
+     "  # some more comments",
+     "7 8 9",
+     "# trailing comment\n",
+     file= "ex.data", sep="\n")
> read.table("ex.data", header = T)
  a b c
1 1 2 3
2 4 5 6
3 7 8 9
> unlink("ex.data")
> 
> ## comment chars in headers
> cat("x1\tx#2\tx3\n1\t2\t2\n2\t3\t3\n", file = "test.dat")
> read.table("test.dat", header=T, comment.char="")
  x1 x.2 x3
1  1   2  2
2  2   3  3
> unlink("test.dat")
> 
> cat('#comment\n\n#another\n#\n#\n',
+     'C1\tC2\tC3\n"Panel"\t"Area Examined"\t"# Blemishes"\n',
+     '"1"\t"0.8"\t"3"\n', '"2"\t"0.6"\t"2"\n', '"3"\t"0.8"\t"3"\n',
+     file = "test.dat", sep="")
> read.table("test.dat")
     V1            V2          V3
1    C1            C2          C3
2 Panel Area Examined # Blemishes
3     1           0.8           3
4     2           0.6           2
5     3           0.8           3
> unlink("test.dat")
> 
> cat('%comment\n\n%another\n%\n%\n',
+     'C1\tC2\tC3\n"Panel"\t"Area Examined"\t"% Blemishes"\n',
+     '"1"\t"0.8"\t"3"\n', '"2"\t"0.6"\t"2"\n', '"3"\t"0.8"\t"3"\n',
+     file = "test.dat", sep="")
> read.table("test.dat", comment.char = "%")
     V1            V2          V3
1    C1            C2          C3
2 Panel Area Examined % Blemishes
3     1           0.8           3
4     2           0.6           2
5     3           0.8           3
> unlink("test.dat")
> 
> ## test on Windows Unicode file
> if(capabilities("iconv")) {
+     print(scan(file(file.path(Sys.getenv("SRCDIR"), "WinUnicode.dat"),
+                     encoding="UCS-2LE"), 0, quiet=TRUE))
+ } else print(1:8)
[1] 1 2 3 4 5 6 7 8
> 
> ## tests of allowEscape
> x <- "1 2 3 \\ab\\c"
> writeLines(x, "test.dat")
> readLines("test.dat")
[1] "1 2 3 \\ab\\c"
> scan("test.dat", "", allowEscapes=TRUE)
Read 4 items
[1] "1"    "2"    "3"    "\abc"
> scan("test.dat", "", allowEscapes=FALSE)
Read 4 items
[1] "1"       "2"       "3"       "\\ab\\c"
> read.table("test.dat", header=FALSE, allowEscapes=TRUE)
  V1 V2 V3   V4
1  1  2  3 \abc
> read.table("test.dat", header=FALSE, allowEscapes=FALSE)
  V1 V2 V3      V4
1  1  2  3 \\ab\\c
> x <- c("TEST", 1, 2, "\\b", 4, 5, "\\040", "\\x20",
+        "c:\\spencer\\tests",
+        "\\t", "\\n", "\\r")
> writeLines(x, "test.dat")
> read.table("test.dat", allowEscapes=FALSE, header = TRUE)
                 TEST
1                   1
2                   2
3                 \\b
4                   4
5                   5
6               \\040
7               \\x20
8  c:\\spencer\\tests
9                 \\t
10                \\n
11                \\r
> unlink("test.dat")
> ## end of tests
> 
