## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set (
    collapse = TRUE,
    warning = TRUE,
    message = TRUE,
    width = 120,
    comment = "#>",
    fig.retina = 2
)

## ----create_package-----------------------------------------------------------
path <- file.path (tempdir (), "demo")
usethis::create_package (path, check_name = FALSE, open = FALSE)

## ----dir_tree-----------------------------------------------------------------
fs::dir_tree (path)

## ----first-fn-----------------------------------------------------------------
code <- c (
    "#' my_function",
    "#'",
    "#' @param x An input",
    "#' @return Something else",
    "#' @examples",
    "#' y <- my_function (x = 1)",
    "#' @export",
    "my_function <- function (x) {",
    "  return (x + 1)",
    "}"
)
writeLines (code, file.path (path, "R", "myfn.R"))
roxygen2::roxygenise (path)

## ----dir_tree2----------------------------------------------------------------
fs::dir_tree (path)

## ----autotest1-fakey, eval = FALSE, echo = TRUE-------------------------------
# library (autotest)
# x0 <- autotest_package (path)

## ----autotest1, eval = TRUE, echo = FALSE-------------------------------------
devtools::load_all (".", export_all = FALSE)
x0 <- autotest_package (path)

## -----------------------------------------------------------------------------
DT::datatable (x0, options = list (dom = "t")) # display table only

## ----autotest-TRUE------------------------------------------------------------
x1 <- autotest_package (path, test = TRUE)
DT::datatable (x1, options = list (dom = "t"))

## ----assert-length------------------------------------------------------------
code <- c (
    "#' my_function",
    "#'",
    "#' @param x An input",
    "#' @return Something else",
    "#' @examples",
    "#' y <- my_function (x = 1.)",
    "#' @export",
    "my_function <- function (x) {",
    "  if (length(x) > 1) {",
    "    warning(\"only the first value of x will be used\")",
    "    x <- x [1]",
    "  }",
    "  return (x + 1)",
    "}"
)
writeLines (code, file.path (path, "R", "myfn.R"))
roxygen2::roxygenise (path)

## ----autotest-TRUE2-----------------------------------------------------------
autotest_package (path, test = TRUE)

## ----int-input----------------------------------------------------------------
code [6] <- gsub ("1.", "1L", code [6], fixed = TRUE)
writeLines (code, file.path (path, "R", "myfn.R"))
roxygen2::roxygenise (path)
x2 <- autotest_package (path, test = TRUE)
DT::datatable (x2, options = list (dom = "t"))

## ----use-as-int---------------------------------------------------------------
code <- c (
    code [1:12],
    "  if (is.numeric (x))",
    "    x <- as.integer (x)",
    code [13:length (code)]
)

## ----unrestricted-------------------------------------------------------------
code [3] <- gsub ("An input", "An unrestricted input", code [3], fixed = TRUE)
writeLines (code, file.path (path, "R", "myfn.R"))
roxygen2::roxygenise (path)
autotest_package (path, test = TRUE)

## ----input-range--------------------------------------------------------------
code <- c (
    "#' my_function",
    "#'",
    "#' @param x An input between 0 and 10",
    "#' @return Something else",
    "#' @examples",
    "#' y <- my_function (x = 1L)",
    "#' @export",
    "my_function <- function (x) {",
    "  if (length(x) > 1) {",
    "    warning(\"only the first value of x will be used\")",
    "    x <- x [1]",
    "  }",
    "  if (is.numeric (x))",
    "    x <- as.integer (x)",
    "  if (x < 0 | x > 10) {",
    "    stop (\"x must be between 0 and 10\")",
    "  }",
    "  return (x + 1L)",
    "}"
)
writeLines (code, file.path (path, "R", "myfn.R"))
roxygen2::roxygenise (path)
autotest_package (path, test = TRUE)

## ----vector-input-------------------------------------------------------------
code <- c (
    "#' my_function",
    "#'",
    "#' @param x An input",
    "#' @return Something else",
    "#' @examples",
    "#' y <- my_function (x = 1)",
    "#' y <- my_function (x = 1:2)",
    "#' @export",
    "my_function <- function (x) {",
    "  if (is.numeric (x)) {",
    "    x <- as.integer (x)",
    "  }",
    "  return (x + 1L)",
    "}"
)
writeLines (code, file.path (path, "R", "myfn.R"))
roxygen2::roxygenise (path)

## ----autotest-TRUE3-----------------------------------------------------------
x3 <- autotest_package (path, test = TRUE)
DT::datatable (x3, options = list (dom = "t"))

## ----list-col-demo------------------------------------------------------------
dat <- data.frame (x = 1:3, y = 4:6)
dat$x <- I (as.list (dat$x)) # base R
dat <- tidyr::nest (dat, y = y)
print (dat)

## ----mtcars-error, error = TRUE-----------------------------------------------
try({
m <- mtcars
head (m, n = 2L)
m$mpg <- I (as.list (m$mpg))
head (m, n = 2L) # looks exaxtly the same
cor (m)
})

## ----mtcars-okay--------------------------------------------------------------
m$mpg <- paste0 ("a", m$mpg)
class (m$mpg)

## ----list-col-input-----------------------------------------------------------
code <- c (
    "#' my_function",
    "#'",
    "#' @param x An input",
    "#' @return Something else",
    "#' @examples",
    "#' y <- my_function (x = 1)",
    "#' y <- my_function (x = 1:2)",
    "#' @export",
    "my_function <- function (x) {",
    "  if (methods::is (unclass (x), \"list\")) {",
    "    x <- unlist (x)",
    "  }",
    "  if (is.numeric (x)) {",
    "    x <- as.integer (x)",
    "  }",
    "  return (x + 1L)",
    "}"
)
writeLines (code, file.path (path, "R", "myfn.R"))
roxygen2::roxygenise (path)

## ----autotest-TRUE4-----------------------------------------------------------
autotest_package (path, test = TRUE)

## ----return-val---------------------------------------------------------------
code <- c (
    "#' my_function3",
    "#'",
    "#' @param x An input",
    "#' @examples",
    "#' y <- my_function3 (x = 1:2)",
    "#' @export",
    "my_function3 <- function (x) {",
    "  return (datasets::iris)",
    "}"
)
writeLines (code, file.path (path, "R", "myfn3.R"))
roxygen2::roxygenise (path) # need to update docs with seed param
x4 <- autotest_package (path, test = TRUE)
DT::datatable (x4, options = list (dom = "t"))

## ----return-val-2-------------------------------------------------------------
code <- c (
    code [1:3],
    "#' @return The iris data set as dataframe",
    code [4:length (code)]
)
writeLines (code, file.path (path, "R", "myfn3.R"))
roxygen2::roxygenise (path) # need to update docs with seed param
x5 <- autotest_package (path, test = TRUE)
DT::datatable (x5, options = list (dom = "t"))

## ----iris-update--------------------------------------------------------------
code [4] <- "#' @return The iris data set as data.frame"
writeLines (code, file.path (path, "R", "myfn3.R"))
roxygen2::roxygenise (path) # need to update docs with seed param
autotest_package (path, test = TRUE)

## ----input-checks-------------------------------------------------------------
code <- c (
    "#' my_function3",
    "#'",
    "#' @param x An input",
    "#' @return The iris data set as data.frame",
    "#' @examples",
    "#' y <- my_function3 (x = datasets::iris)",
    "#' @export",
    "my_function3 <- function (x) {",
    "  return (x)",
    "}"
)
writeLines (code, file.path (path, "R", "myfn3.R"))
roxygen2::roxygenise (path) # need to update docs with seed param
x6 <- autotest_package (path, test = TRUE)
DT::datatable (x6, options = list (dom = "t"))

## ----input-fix, eval = FALSE--------------------------------------------------
# code [3] <- "#' @param x An input which can be a data.frame"

