This report is automatically generated with the R
package knitr
(version 1.5
)
.
# Chapter 10 Debugging Your Code NOTE : Much code is commented out, as they generate errors # on purpose. Uncomment the code and run the line to see the error and try the debugging # out Knowing What to Look For Reading Errors and Warnings Reading error messages 'a' + 1 # Error in 'a' + 1 : non-numeric argument to binary operator data.frame(1:10,10:1,) Error # in data.frame(1:10, 10:1, ) : argument is missing, with no default Caring about warnings # (or not) x <- 1:10 y <- if (x < 5) 0 else 1
## Warning: the condition has length > 1 and only the first element will be used
x <- 4 sqrt(x - 5)
## Warning: NaNs produced
## [1] NaN
plot(1:10, 10:1, color = "green")
## Warning: "color" is not a graphical parameter ## Warning: "color" is not a graphical parameter ## Warning: "color" is not a graphical parameter ## Warning: "color" is not a graphical parameter ## Warning: "color" is not a graphical parameter ## Warning: "color" is not a graphical parameter
# Going Bug Hunting Calculating the logit checks input and does logit calculation logit <- function(x) { x <- ifelse(x < 0 | x > 1, "NA", x) log(x/(1 - x)) } # transforms percentage to number and calls logit logitpercent <- function(x) { x <- gsub("%", "", x) logit(as.numeric(x)) } ## Knowing where an error comes from logitpercent('50%') Error in 1 - x : non-numeric ## argument to binary operator traceback() Looking inside a function Telling R which ## function to debug debug(logit) logitpercent('50%') Stepping through the function Start ## browsing from within the function logit <- function(x) { x <- ifelse(x < 0 | x > 1, "NA", x) browser() log(x/(1 - x)) } # logit(50) Generating Your Own Messages Creating errors logit <- function(x) { if (any(x < 0 | x > 1)) stop("x not between 0 and 1") log(x/(1 - x)) } # logitpercent(c('50%','150%')) Error in logit(as.numeric(x)/100) : x not between 0 and 1 # Creating warnings Function wrapped around for illustrative purposes In book only body is # given logit <- function(x) { x <- ifelse(x < 0 | x > 1, NA, x) if (any(is.na(x))) warning("x not between 0 and 1") log(x/(1 - x)) } logitpercent(c("50%", "150%"))
## Warning: x not between 0 and 1
## [1] NA NA
# Recognizing the Mistakes You're Sure to Make Starting with the wrong data Having your # data in the wrong format Dropping dimensions when you don’t expect it rowsum.df <- function(x) { id <- sapply(x, is.numeric) rowSums(x[, id]) } # rowsum.df(sleep) Messing up with lists strsplit("this is a sentence", " ")[2]
## [[1]] ## NULL
strsplit("this is a sentence", " ")
## [[1]] ## [1] "this" "is" "a" "sentence"
strsplit("this is a sentence", " ")[[1]][2]
## [1] "is"
customer <- c("Johan Delong", "Marie Petit") namesplit <- strsplit(customer, " ") paste(namesplit[2], collapse = ".")
## [1] "c(\"Marie\", \"Petit\")"
paste(namesplit[[2]], collapse = ".")
## [1] "Marie.Petit"
### Mixing up factors and numeric vectors cyl.factor <- as.factor(mtcars$cyl) median(as.numeric(cyl.factor))
## [1] 2
as.numeric(levels(cyl.factor))[cyl.factor]
## [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
The R session information (including the OS info, R version and all packages used):
sessionInfo()
## R version 3.0.2 (2013-09-25) ## Platform: x86_64-w64-mingw32/x64 (64-bit) ## ## locale: ## [1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252 ## [3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C ## [5] LC_TIME=English_United Kingdom.1252 ## ## attached base packages: ## [1] stats graphics grDevices utils datasets methods base ## ## other attached packages: ## [1] BiocInstaller_1.12.1 ggplot2_0.9.3.1 reshape2_1.2.2 sos_1.3-8 ## [5] brew_1.0-6 stringr_0.6.2 knitr_1.5 plyr_1.8 ## [9] Revobase_7.1.0 RevoMods_7.1.0 RevoScaleR_7.1.0 lattice_0.20-27 ## [13] rpart_4.1-2 ## ## loaded via a namespace (and not attached): ## [1] codetools_0.2-8 colorspace_1.2-4 dichromat_2.0-0 digest_0.6.4 ## [5] evaluate_0.5.1 foreach_1.4.1 formatR_0.10 fortunes_1.5-2 ## [9] grid_3.0.2 gtable_0.1.2 highr_0.3 iterators_1.0.6 ## [13] labeling_0.2 MASS_7.3-29 munsell_0.4.2 proto_0.3-10 ## [17] RColorBrewer_1.0-5 scales_0.2.3 tools_3.0.2
Sys.time()
## [1] "2014-05-13 15:05:46 BST"