A Report Generated by knitr

This report is automatically generated with the R package knitr (version `1.5`) .

    # Chapter 8 Putting the Fun in Functions Moving from Scripts to Functions Making the script
    x <- c(0.458, 1.6653, 0.83112)
    percent <- round(x * 100, digits = 1)
    result <- paste(percent, "%", sep = "")
    print(result)

    ## [1] "45.8%"  "166.5%" "83.1%"

    # source('pastePercent.R') # Only after saving Transforming the script
    addPercent <- function(x) {
        percent <- round(x * 100, digits = 1)
        result <- paste(percent, "%", sep = "")
        return(result)
    }
    ## Using the function
    ls()

    ## [1] "addPercent" "percent"    "result"     "x"

    ### Formatting the numbers
    new.numbers <- c(0.8223, 0.02487, 1.62, 0.4)
    addPercent(new.numbers)

    ## [1] "82.2%" "2.5%"  "162%"  "40%"

    ### Playing with function objects
    ppaste <- addPercent
    ppaste

    ## function(x) {
    ##     percent <- round(x * 100, digits = 1)
    ##     result <- paste(percent, "%", sep = "")
    ##     return(result)
    ## }
    ##

    ## Reducing the number of lines Returning values by default AddPercent function without last
    ## return - not written in book
    addPercent <- function(x) {
        percent <- round(x * 100, digits = 1)
        result <- paste(percent, "%", sep = "")
    }
    print(addPercent(new.numbers))

    ## [1] "82.2%" "2.5%"  "162%"  "40%"

    addPercent <- function(x) {
        percent <- round(x * 100, digits = 1)
        paste(percent, "%", sep = "")
    }
    addPercent <- function(x) {
        if (!is.numeric(x))
            return(NULL)
        percent <- round(x * 100, digits = 1)
        paste(percent, "%", sep = "")
    }
    ### Breaking the walls
    odds <- function(x) x/(1 - x)
    odds(0.8)

    ## [1] 4

    addPercent <- function(x) paste(round(x * 100, digits = 1), "%", sep = "")
    # Using Arguments the Smart Way Adding more arguments
    percentages <- c(58.23, 120.4, 33)
    addPercent(percentages/100)

    ## [1] "58.2%"  "120.4%" "33%"

    ### Adding the mult argument
    addPercent <- function(x, mult) {
        percent <- round(x * mult, digits = 1)
        paste(percent, "%", sep = "")
    }
    addPercent(percentages, mult = 1)

    ## [1] "58.2%"  "120.4%" "33%"

    ### Adding a default value addPercent(new.numbers) # Gives error for illustrative purposes
    ### Error in x * mult : 'mult' is missing
    addPercent <- function(x, mult = 100) {
        percent <- round(x * mult, digits = 1)
        paste(percent, "%", sep = "")
    }
    addPercent(new.numbers)

    ## [1] "82.2%" "2.5%"  "162%"  "40%"

    addPercent(percentages, 1)

    ## [1] "58.2%"  "120.4%" "33%"

    ## Conjuring tricks with dots
    addPercent <- function(x, mult = 100, ...) {
        percent <- round(x * mult, ...)
        paste(percent, "%", sep = "")
    }
    addPercent(new.numbers, digits = 2)

    ## [1] "82.23%" "2.49%"  "162%"   "40%"

    addPercent(new.numbers)

    ## [1] "82%"  "2%"   "162%" "40%"

    addPercent <- function(x, mult = 100, digits = 1) {
        percent <- round(x * mult, digits = digits)
        paste(percent, "%", sep = "")
    }
    ## Using functions as arguments Applying different ways of rounding
    addPercent <- function(x, mult = 100, FUN = round, ...) {
        percent <- FUN(x * mult, ...)
        paste(percent, "%", sep = "")
    }
    addPercent(new.numbers, FUN = signif, digits = 3)

    ## [1] "82.2%" "2.49%" "162%"  "40%"

    ### Using anonymous functions
    profits <- c(2100, 1430, 3580, 5230)
    rel.profit <- function(x) round(x/sum(x) * 100)
    addPercent(profits, FUN = function(x) round(x/sum(x) * 100))

    ## [1] "17%" "12%" "29%" "42%"

    addPercent(profits/sum(profits))

    ## [1] "17%" "12%" "29%" "42%"

    # Coping with Scoping Crossing the borders Creating a test case
    x <- 1:5
    test <- function(x) {
        cat("This is x:", x, "\n")
        rm(x)
        cat("This is x after removing it:", x, "\n")
    }
    test(5:1)

    ## This is x: 5 4 3 2 1
    ## This is x after removing it: 1 2 3 4 5

    ### Searching the path Using internal functions
    calculate.eff <- function(x, y, control) {
        min.base <- function(z) z - mean(control)
        min.base(x)/min.base(y)
    }
    half <- c(2.23, 3.23, 1.48)
    full <- c(4.85, 4.95, 4.12)
    nothing <- c(0.14, 0.18, 0.56, 0.23)
    calculate.eff(half, full, nothing)

    ## [1] 0.4270 0.6319 0.3129

    # Dispatching to a Method Finding the methods behind the function
    print

    ## function (x, ...)
    ## UseMethod("print")
    ##
    ##

    ### Using methods with UseMethod
    small.one <- data.frame(a = 1:2, b = 2:1)
    print.data.frame(small.one)

    ##   a b
    ## 1 1 2
    ## 2 2 1

    ### Using default methods
    print.default(small.one)

    ## $a
    ## [1] 1 2
    ##
    ## $b
    ## [1] 2 1
    ##
    ## attr(,"class")
    ## [1] "data.frame"

    ## Doing it yourself Adapting the addPercent function
    addPercent.character <- function(x) {
        paste(x, "%", sep = "")
    }
    # Not written out in the book - needed for rest code #
    addPercent.numeric <- function(x, mult = 100, FUN = round, ...) {
        percent <- FUN(x * mult, ...)
        paste(percent, "%", sep = "")
    }
    addPercent <- function(x, ...) {
        UseMethod("addPercent")
    }
    addPercent(new.numbers, FUN = floor)

    ## [1] "82%"  "2%"   "162%" "40%"

    addPercent(letters[1:6])

    ## [1] "a%" "b%" "c%" "d%" "e%" "f%"

    # Adding a default function addPercent(small.one) # Gives error on purpose Error in
    # UseMethod('addPercent') : no applicable method for 'addPercent' applied to an object of
    # class 'data.frame'
    addPercent.default <- function(x) {
        cat("You should try a numeric or character vector.\n")
    }

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:42 BST"