1
1
# readObservationsFromCsvText --------------------------------------------------
2
- readObservationsFromCsvText <- function (text , sep , dec , quote , colClasses , ... )
2
+ readObservationsFromCsvText <- function (
3
+ text , sep , dec , quote , colClasses , dbg = TRUE , ...
4
+ )
3
5
{
4
6
# If colClasses is specified, reduce it to the columns that actually occur
5
7
if (! identical(colClasses , NA )) {
@@ -19,35 +21,64 @@ readObservationsFromCsvText <- function(text, sep, dec, quote, colClasses, ...)
19
21
dot.args <- list (... )
20
22
# dot.args <- list(header = TRUE) # for debugging!
21
23
22
- result <- try(kwb.utils :: callWith(
23
- utils :: read.table ,
24
+ common_args <- c(dot.args , list (
24
25
text = text ,
25
26
sep = sep ,
26
27
dec = dec ,
27
28
quote = quote ,
28
29
comment.char = " " ,
29
30
blank.lines.skip = FALSE ,
30
- stringsAsFactors = FALSE ,
31
- colClasses = colClasses ,
32
- dot.args
31
+ stringsAsFactors = FALSE
33
32
))
34
33
35
- if (! kwb.utils :: isTryError(result )) {
36
- return (result )
34
+ tryCatch(
35
+ expr = do.call(
36
+ utils :: read.table , c(common_args , list (colClasses = colClasses ))
37
+ ),
38
+ silent = TRUE ,
39
+ error = {
40
+ data <- do.call(utils :: read.table , c(common_args , list (colClasses = NA )))
41
+ convertTypes(data , classes = sapply(
42
+ X = get_elements(inspectionDataFieldCodes(), names(data )),
43
+ FUN = get_elements ,
44
+ elements = " class"
45
+ ))
46
+ },
47
+ dbg = dbg
48
+ )
49
+ }
50
+
51
+ # convertTypes -----------------------------------------------------------------
52
+ convertTypes <- function (data , classes , dbg = TRUE )
53
+ {
54
+ verbose_converter <- function (FUN , what ) {
55
+ function (x ) {
56
+ suppressWarnings(y <- FUN(x ))
57
+ failed <- ! is.na(x ) & is.na(y )
58
+ if (any(failed )) {
59
+ message(sprintf(
60
+ " Could not convert the following values to %s: %s" ,
61
+ what , kwb.utils :: stringList(unique(x [failed ]))
62
+ ))
63
+ }
64
+ y
65
+ }
37
66
}
38
67
39
- result <- kwb.utils :: callWith(
40
- utils :: read.table ,
41
- text = text ,
42
- sep = sep ,
43
- dec = dec ,
44
- quote = quote ,
45
- comment.char = " " ,
46
- blank.lines.skip = FALSE ,
47
- stringsAsFactors = FALSE ,
48
- colClasses = NA ,
49
- dot.args
68
+ converters <- list (
69
+ character = as.character ,
70
+ numeric = verbose_converter(as.numeric , " numeric" ),
71
+ integer = verbose_converter(as.integer , " integer" )
50
72
)
51
73
52
- convertTypes(result , codes = inspectionDataFieldCodes())
74
+ for (column in names(which(sapply(data , " class" ) != classes ))) {
75
+ class <- classes [column ]
76
+ data [[column ]] <- kwb.utils :: catAndRun(
77
+ messageText = sprintf(" Converting column '%s' to %s" , column , class ),
78
+ expr = (get_elements(converters , class ))(data [[column ]]),
79
+ dbg = dbg
80
+ )
81
+ }
82
+
83
+ data
53
84
}
0 commit comments