mirror of https://git.sr.ht/~hrbrmstr/freebase
boB Rudis
6 years ago
commit
27e4a5b75a
28 changed files with 612 additions and 0 deletions
@ -0,0 +1,11 @@ |
|||
^.*\.Rproj$ |
|||
^\.Rproj\.user$ |
|||
^\.travis\.yml$ |
|||
^README\.*Rmd$ |
|||
^README\.*html$ |
|||
^NOTES\.*Rmd$ |
|||
^NOTES\.*html$ |
|||
^\.codecov\.yml$ |
|||
^README_files$ |
|||
^doc$ |
|||
^tmp$ |
@ -0,0 +1 @@ |
|||
comment: false |
@ -0,0 +1,8 @@ |
|||
.DS_Store |
|||
.Rproj.user |
|||
.Rhistory |
|||
.RData |
|||
.Rproj |
|||
src/*.o |
|||
src/*.so |
|||
src/*.dll |
@ -0,0 +1,6 @@ |
|||
language: R |
|||
sudo: false |
|||
cache: packages |
|||
|
|||
after_success: |
|||
- Rscript -e 'covr::codecov()' |
@ -0,0 +1,30 @@ |
|||
Package: freebase |
|||
Type: Package |
|||
Title: A 'usethis'-like Package for Base Pseudo-equivalents of 'tidyverse' Code |
|||
Version: 0.1.0 |
|||
Date: 2018-05-28 |
|||
Authors@R: c( |
|||
person("Bob", "Rudis", email = "bob@rud.is", role = c("aut", "cre"), |
|||
comment = c(ORCID = "0000-0001-5670-2640")) |
|||
) |
|||
Maintainer: Bob Rudis <bob@rud.is> |
|||
Description: The 'tidyverse' is awesome, but can take a bit compile on systems |
|||
where there are no pre-built binary packages. Methods are provided which use |
|||
the facilities of the 'usethis' package to snap-in base versions of useful |
|||
'tidyverse' functions that are mostly equivalent (some are more complete |
|||
than others). The base R counterpart functions will likely be slower than |
|||
the 'tidyverse' equivalents but using them will decrease 'Imports' |
|||
dependencies. Use delibrately and with caution. |
|||
URL: https://github.com/hrbrmstr/freebase |
|||
BugReports: https://github.com/hrbrmstr/freebase/issues |
|||
Encoding: UTF-8 |
|||
License: MIT + file LICENSE |
|||
Suggests: |
|||
testthat, |
|||
covr |
|||
Depends: |
|||
R (>= 3.2.0) |
|||
Imports: |
|||
usethis, |
|||
rprojroot |
|||
RoxygenNote: 6.0.1.9000 |
@ -0,0 +1,2 @@ |
|||
YEAR: 2018 |
|||
COPYRIGHT HOLDER: Bob Rudis |
@ -0,0 +1,8 @@ |
|||
# Generated by roxygen2: do not edit by hand |
|||
|
|||
export(use_infix_helpers) |
|||
export(use_keepers) |
|||
export(use_mappers) |
|||
export(use_safely) |
|||
import(rprojroot) |
|||
import(usethis) |
@ -0,0 +1,2 @@ |
|||
0.1.0 |
|||
* Initial release |
@ -0,0 +1,16 @@ |
|||
#' A 'usethis'-like Package for Base Pseudo-equivalents of 'tidyverse' Code |
|||
#' |
|||
#' The 'tidyverse' is awesome, but can take a bit compile on systems |
|||
#' where there are no pre-built binary packages. Methods are provided which use |
|||
#' the facilities of the 'usethis' package to snap-in base versions of useful |
|||
#' 'tidyverse' functions that are mostly equivalent (some are more complete |
|||
#' than others). The base R counterpart functions will likely be slower than |
|||
#' the 'tidyverse' equivalents but using them will decrease 'Imports' |
|||
#' dependencies. Use delibrately and with caution. |
|||
#' |
|||
#' @md |
|||
#' @name freebase |
|||
#' @docType package |
|||
#' @author Bob Rudis (bob@@rud.is) |
|||
#' @import usethis rprojroot |
|||
NULL |
@ -0,0 +1,15 @@ |
|||
#' Use infix-helpers |
|||
#' |
|||
#' * Creates `R/utils-infix-helpers.R` with base R `%XXX%` helpers |
|||
#' |
|||
#' @md |
|||
#' @param save_as Where to save/what to name the file. Defaults to "`R/utils-infix-helpers.R`" |
|||
#' @param open if `TRUE`, open the resultant file |
|||
#' @export |
|||
use_infix_helpers <- function(save_as = "R/utils-infix-helpers.R", open = TRUE) { |
|||
|
|||
check_is_package("use_infix_helpers()") |
|||
|
|||
use_template("infix-helpers.R", save_as = save_as , open = open, package = "freebase") |
|||
|
|||
} |
@ -0,0 +1,16 @@ |
|||
#' Use base-ified equivalents of keep/discard/compact |
|||
#' |
|||
#' * Creates `R/utils-keepers.R` with base R pseudo-equivalents for `purrr` |
|||
#' `keep`/`discard`/`compact` |
|||
#' |
|||
#' @md |
|||
#' @param save_as Where to save/what to name the file. Defaults to "`R/utils-keepers.R`" |
|||
#' @param open if `TRUE`, open the resultant file |
|||
#' @export |
|||
use_keepers <- function(save_as = "R/utils-keepers.R", open = TRUE) { |
|||
|
|||
check_is_package("use_keepers()") |
|||
|
|||
use_template("keepers.R", save_as = save_as , open = open, package = "freebase") |
|||
|
|||
} |
@ -0,0 +1,15 @@ |
|||
#' Use base-ified equivalents of 'map'-pers |
|||
#' |
|||
#' * Creates `R/utils-mappers.R` with base R pseudo-equivalents for `purrr` `map`-pers. |
|||
#' |
|||
#' @md |
|||
#' @param save_as Where to save/what to name the file. Defaults to "`R/utils-mappers.R`" |
|||
#' @param open if `TRUE`, open the resultant file |
|||
#' @export |
|||
use_mappers <- function(save_as = "R/utils-mappers.R", open = TRUE) { |
|||
|
|||
check_is_package("use_mappers()") |
|||
|
|||
use_template("mappers.R", save_as = save_as , open = open, package = "freebase") |
|||
|
|||
} |
@ -0,0 +1,15 @@ |
|||
#' Use base-ified equivalents of "safely"-ifiers |
|||
#' |
|||
#' * Creates `R/utils-safely.R` with base R pseudo-equivalents for `purrr` `safely` (et al). |
|||
#' |
|||
#' @md |
|||
#' @param save_as Where to save/what to name the file. Defaults to "`R/utils-safely.R`" |
|||
#' @param open if `TRUE`, open the resultant file |
|||
#' @export |
|||
use_safely <- function(save_as = "R/utils-safely.R", open = TRUE) { |
|||
|
|||
check_is_package("use_safely()") |
|||
|
|||
use_template("safely.R", save_as = save_as , open = open, package = "freebase") |
|||
|
|||
} |
@ -0,0 +1,20 @@ |
|||
check_is_package <- function (whos_asking = NULL) { |
|||
|
|||
if (is_package()) return(invisible()) |
|||
|
|||
message <- paste0("Project ", value(project_name()), " is not an R package.") |
|||
|
|||
if (!is.null(whos_asking)) { |
|||
message <- paste0(code(whos_asking), " is designed to work with packages. ", |
|||
message) |
|||
} |
|||
|
|||
stop(message, call. = FALSE) |
|||
|
|||
} |
|||
|
|||
is_package <- function (base_path = proj_get()){ |
|||
res <- tryCatch(rprojroot::find_package_root_file(path = base_path), |
|||
error = function(e) NULL) |
|||
!is.null(res) |
|||
} |
@ -0,0 +1,47 @@ |
|||
--- |
|||
output: rmarkdown::github_document |
|||
--- |
|||
|
|||
# freebase |
|||
|
|||
A 'usethis'-like Package for Base Pseudo-equivalents of 'tidyverse' Code |
|||
|
|||
## Description |
|||
|
|||
The 'tidyverse' is awesome, but can take a bit compile on systems |
|||
where there are no pre-built binary packages. Methods are provided which use |
|||
the facilities of the 'usethis' package to snap-in base versions of useful |
|||
'tidyverse' functions that are mostly equivalent (some are more complete |
|||
than others). The base R counterpart functions will likely be slower than |
|||
the 'tidyverse' equivalents but using them will decrease 'Imports' |
|||
dependencies. Use delibrately and with caution. |
|||
|
|||
## What's Inside The Tin |
|||
|
|||
The following functions are implemented: |
|||
|
|||
- `use_infix_helpers`: Use infix-helpers |
|||
- `use_keepers`: Use base-ified equivalents of keep/discard/compact |
|||
- `use_mappers`: Use base-ified equivalents of 'map'-pers |
|||
- `use_safely`: Use base-ified equivalents of "safely"-ifiers |
|||
|
|||
## Installation |
|||
|
|||
```{r eval=FALSE} |
|||
devtools::install_github("hrbrmstr/freebase") |
|||
``` |
|||
|
|||
```{r message=FALSE, warning=FALSE, error=FALSE, include=FALSE} |
|||
options(width=120) |
|||
``` |
|||
|
|||
## Usage |
|||
|
|||
```{r message=FALSE, warning=FALSE, error=FALSE} |
|||
library(freebase) |
|||
|
|||
# current verison |
|||
packageVersion("freebase") |
|||
|
|||
``` |
|||
|
@ -0,0 +1,40 @@ |
|||
|
|||
# freebase |
|||
|
|||
A ‘usethis’-like Package for Base Pseudo-equivalents of ‘tidyverse’ Code |
|||
|
|||
## Description |
|||
|
|||
The ‘tidyverse’ is awesome, but can take a bit compile on systems where |
|||
there are no pre-built binary packages. Methods are provided which use |
|||
the facilities of the ‘usethis’ package to snap-in base versions of |
|||
useful ‘tidyverse’ functions that are mostly equivalent (some are more |
|||
complete than others). The base R counterpart functions will likely be |
|||
slower than the ‘tidyverse’ equivalents but using them will decrease |
|||
‘Imports’ dependencies. Use delibrately and with caution. |
|||
|
|||
## What’s Inside The Tin |
|||
|
|||
The following functions are implemented: |
|||
|
|||
- `use_infix_helpers`: Use infix-helpers |
|||
- `use_keepers`: Use base-ified equivalents of keep/discard/compact |
|||
- `use_mappers`: Use base-ified equivalents of ‘map’-pers |
|||
- `use_safely`: Use base-ified equivalents of “safely”-ifiers |
|||
|
|||
## Installation |
|||
|
|||
``` r |
|||
devtools::install_github("hrbrmstr/freebase") |
|||
``` |
|||
|
|||
## Usage |
|||
|
|||
``` r |
|||
library(freebase) |
|||
|
|||
# current verison |
|||
packageVersion("freebase") |
|||
``` |
|||
|
|||
## [1] '0.1.0' |
@ -0,0 +1,21 @@ |
|||
Version: 1.0 |
|||
|
|||
RestoreWorkspace: Default |
|||
SaveWorkspace: Default |
|||
AlwaysSaveHistory: Default |
|||
|
|||
EnableCodeIndexing: Yes |
|||
UseSpacesForTab: Yes |
|||
NumSpacesForTab: 2 |
|||
Encoding: UTF-8 |
|||
|
|||
RnwWeave: Sweave |
|||
LaTeX: pdfLaTeX |
|||
|
|||
StripTrailingWhitespace: Yes |
|||
|
|||
BuildType: Package |
|||
PackageUseDevtools: Yes |
|||
PackageInstallArgs: --no-multiarch --with-keep.source |
|||
PackageBuildArgs: --resave-data |
|||
PackageRoxygenize: rd,collate,namespace |
@ -0,0 +1,3 @@ |
|||
`%l0%` <- function(x, y) if (length(x) == 0) y else x |
|||
`%||%` <- function(x, y) if (is.null(x)) y else x |
|||
`%@%` <- function (x, name) attr(x, name, exact = TRUE) |
@ -0,0 +1,17 @@ |
|||
# NOTE!!! |
|||
# This requires map_lgl() which requries map() |
|||
|
|||
is_empty <- function(x) length(x) == 0 |
|||
|
|||
keep <- function(.x, .p, ...) { |
|||
.x[map_lgl(.x, .p, ...)] |
|||
} |
|||
|
|||
discard <- function(.x, .p, ...) { |
|||
.x[!map_lgl(.x, .p, ...)] |
|||
} |
|||
|
|||
compact <- function(.x, .p=identity) { |
|||
discard(.x, function(x) is_empty(.p(x))) |
|||
} |
|||
|
@ -0,0 +1,129 @@ |
|||
# NOTE these aren't 100% equivalent to the purrr mappers but cover very common use-cases |
|||
map <- function(.x, .f, ...) { |
|||
|
|||
if (inherits(.f, "formula")) { |
|||
.body <- dimnames(attr(terms(.f), "factors"))[[1]] |
|||
.f <- function(.x, .=.x) {} |
|||
body(.f) <- as.expression(parse(text=.body)) |
|||
} |
|||
|
|||
if (inherits(.f, "function")) { |
|||
lapply(.x, .f, ...) |
|||
} else if (is.numeric(.f)) { |
|||
lapply(.x, `[`, .f) |
|||
} |
|||
|
|||
} |
|||
|
|||
map2 <- function(.x, .y, .f, ...) { |
|||
|
|||
if (inherits(.f, "formula")) { |
|||
.body <- dimnames(attr(terms(.f), "factors"))[[1]] |
|||
.f <- function(.x, .y, .=.x) {} |
|||
body(.f) <- as.expression(parse(text=.body)) |
|||
} |
|||
|
|||
if (inherits(.f, "function")) { |
|||
mapply(.f, .x, .y, ..., SIMPLIFY=FALSE, USE.NAMES=FALSE) |
|||
} |
|||
|
|||
} |
|||
|
|||
map_chr <- function(.x, .f, ...) { |
|||
as.character(unlist(map(.x, .f, ...), use.names = FALSE)) |
|||
} |
|||
|
|||
map2_chr <- function(.x, .y, .f, ...) { |
|||
as.character(unlist(map2(.x, .y, .f, ...), use.names = FALSE)) |
|||
} |
|||
|
|||
map_lgl <- function(.x, .f, ...) { |
|||
as.logical(unlist(map(.x, .f, ...), use.names = FALSE)) |
|||
} |
|||
|
|||
map2_lgl <- function(.x, .y, .f, ...) { |
|||
as.logical(unlist(map2(.x, .y, .f, ...), use.names = FALSE)) |
|||
} |
|||
|
|||
map_dbl <- function(.x, .f, ...) { |
|||
as.double(unlist(map(.x, .f, ...), use.names = FALSE)) |
|||
} |
|||
|
|||
map2_dbl <- function(.x, .y, .f, ...) { |
|||
as.double(unlist(map2(.x, .y, .f, ...), use.names = FALSE)) |
|||
} |
|||
|
|||
map_int <- function(.x, .f, ...) { |
|||
as.integer(unlist(map(.x, .f, ...), use.names = FALSE)) |
|||
} |
|||
|
|||
map2_int <- function(.x, .y, .f, ...) { |
|||
as.integer(unlist(map2(.x, .y, .f, ...), use.names = FALSE)) |
|||
} |
|||
|
|||
|
|||
map_df <- function(.x, .f, ..., .id=NULL) { |
|||
|
|||
res <- map(.x, .f, ...) |
|||
out <- bind_rows(res, .id=.id) |
|||
out |
|||
|
|||
} |
|||
|
|||
map2_df <- function(.x, .y, .f, ..., .id=NULL) { |
|||
|
|||
res <- map(.x, .y, .f, ...) |
|||
out <- bind_rows(res, .id=.id) |
|||
out |
|||
|
|||
} |
|||
|
|||
# this has limitations and is more like 75% of dplyr::bind_rows() |
|||
# this is also orders of magnitude slower than dplyr::bind_rows() |
|||
bind_rows <- function(..., .id = NULL) { |
|||
|
|||
res <- list(...) |
|||
|
|||
if (length(res) == 1) res <- res[[1]] |
|||
|
|||
cols <- unique(unlist(lapply(res, names), use.names = FALSE)) |
|||
|
|||
if (!is.null(.id)) { |
|||
inthere <- cols[.id %in% cols] |
|||
if (length(inthere) > 0) { |
|||
.id <- make.unique(c(inthere, .id))[2] |
|||
} |
|||
} |
|||
|
|||
id_vals <- if (is.null(names(res))) 1:length(res) else names(res) |
|||
|
|||
saf <- default.stringsAsFactors() |
|||
options(stringsAsFactors = FALSE) |
|||
on.exit(options(stringsAsFactors = saf)) |
|||
|
|||
idx <- 1 |
|||
do.call( |
|||
rbind.data.frame, |
|||
lapply(res, function(.x) { |
|||
x_names <- names(.x) |
|||
moar_names <- setdiff(cols, x_names) |
|||
if (length(moar_names) > 0) { |
|||
for (i in 1:length(moar_names)) { |
|||
.x[[moar_names[i]]] <- rep(NA, length(.x[[1]])) |
|||
} |
|||
} |
|||
if (!is.null(.id)) { |
|||
.x[[.id]] <- id_vals[idx] |
|||
idx <<- idx + 1 |
|||
} |
|||
.x |
|||
}) |
|||
) -> out |
|||
|
|||
rownames(out) <- NULL |
|||
|
|||
class(out) <- c("tbl_df", "tbl", "data.frame") |
|||
|
|||
out |
|||
|
|||
} |
@ -0,0 +1,90 @@ |
|||
# Less cool counterparts to purrr's side-effect capture-rs |
|||
# |
|||
# Most of the helper functions are 100% from output.R in purrr repo |
|||
# |
|||
# @param quiet Hide errors (`TRUE`, the default), or display them |
|||
# as they occur? |
|||
# @param otherwise Default value to use when an error occurs. |
|||
# |
|||
# @return `safely`: wrapped function instead returns a list with |
|||
# components `result` and `error`. One value is always `NULL`. |
|||
# |
|||
# `quietly`: wrapped function instead returns a list with components |
|||
# `result`, `output`, `messages` and `warnings`. |
|||
# |
|||
# `possibly`: wrapped function uses a default value (`otherwise`) |
|||
# whenever an error occurs. |
|||
safely <- function(.f, otherwise = NULL, quiet = TRUE) { |
|||
function(...) capture_error(.f(...), otherwise, quiet) |
|||
} |
|||
|
|||
quietly <- function(.f) { |
|||
function(...) capture_output(.f(...)) |
|||
} |
|||
|
|||
possibly <- function(.f, otherwise, quiet = TRUE) { |
|||
force(otherwise) |
|||
function(...) { |
|||
tryCatch(.f(...), |
|||
error = function(e) { |
|||
if (!quiet) |
|||
message("Error: ", e$message) |
|||
otherwise |
|||
}, |
|||
interrupt = function(e) { |
|||
stop("Terminated by user", call. = FALSE) |
|||
} |
|||
) |
|||
} |
|||
} |
|||
|
|||
capture_error <- function(code, otherwise = NULL, quiet = TRUE) { |
|||
tryCatch( |
|||
list(result = code, error = NULL), |
|||
error = function(e) { |
|||
if (!quiet) |
|||
message("Error: ", e$message) |
|||
|
|||
list(result = otherwise, error = e) |
|||
}, |
|||
interrupt = function(e) { |
|||
stop("Terminated by user", call. = FALSE) |
|||
} |
|||
) |
|||
} |
|||
|
|||
capture_output <- function(code) { |
|||
warnings <- character() |
|||
wHandler <- function(w) { |
|||
warnings <<- c(warnings, w$message) |
|||
invokeRestart("muffleWarning") |
|||
} |
|||
|
|||
messages <- character() |
|||
mHandler <- function(m) { |
|||
messages <<- c(messages, m$message) |
|||
invokeRestart("muffleMessage") |
|||
} |
|||
|
|||
temp <- file() |
|||
sink(temp) |
|||
on.exit({ |
|||
sink() |
|||
close(temp) |
|||
}) |
|||
|
|||
result <- withCallingHandlers( |
|||
code, |
|||
warning = wHandler, |
|||
message = mHandler |
|||
) |
|||
|
|||
output <- paste0(readLines(temp, warn = FALSE), collapse = "\n") |
|||
|
|||
list( |
|||
result = result, |
|||
output = output, |
|||
warnings = warnings, |
|||
messages = messages |
|||
) |
|||
} |
@ -0,0 +1,19 @@ |
|||
% Generated by roxygen2: do not edit by hand |
|||
% Please edit documentation in R/freebase-package.R |
|||
\docType{package} |
|||
\name{freebase} |
|||
\alias{freebase} |
|||
\alias{freebase-package} |
|||
\title{A 'usethis'-like Package for Base Pseudo-equivalents of 'tidyverse' Code} |
|||
\description{ |
|||
The 'tidyverse' is awesome, but can take a bit compile on systems |
|||
where there are no pre-built binary packages. Methods are provided which use |
|||
the facilities of the 'usethis' package to snap-in base versions of useful |
|||
'tidyverse' functions that are mostly equivalent (some are more complete |
|||
than others). The base R counterpart functions will likely be slower than |
|||
the 'tidyverse' equivalents but using them will decrease 'Imports' |
|||
dependencies. Use delibrately and with caution. |
|||
} |
|||
\author{ |
|||
Bob Rudis (bob@rud.is) |
|||
} |
@ -0,0 +1,18 @@ |
|||
% Generated by roxygen2: do not edit by hand |
|||
% Please edit documentation in R/use-infix-helpers.R |
|||
\name{use_infix_helpers} |
|||
\alias{use_infix_helpers} |
|||
\title{Use infix-helpers} |
|||
\usage{ |
|||
use_infix_helpers(save_as = "R/utils-infix-helpers.R", open = TRUE) |
|||
} |
|||
\arguments{ |
|||
\item{save_as}{Where to save/what to name the file. Defaults to "\code{R/utils-infix-helpers.R}"} |
|||
|
|||
\item{open}{if \code{TRUE}, open the resultant file} |
|||
} |
|||
\description{ |
|||
\itemize{ |
|||
\item Creates \code{R/utils-infix-helpers.R} with base R \code{\%XXX\%} helpers |
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
% Generated by roxygen2: do not edit by hand |
|||
% Please edit documentation in R/use-keepers.R |
|||
\name{use_keepers} |
|||
\alias{use_keepers} |
|||
\title{Use base-ified equivalents of keep/discard/compact} |
|||
\usage{ |
|||
use_keepers(save_as = "R/utils-keepers.R", open = TRUE) |
|||
} |
|||
\arguments{ |
|||
\item{save_as}{Where to save/what to name the file. Defaults to "\code{R/utils-keepers.R}"} |
|||
|
|||
\item{open}{if \code{TRUE}, open the resultant file} |
|||
} |
|||
\description{ |
|||
\itemize{ |
|||
\item Creates \code{R/utils-keepers.R} with base R pseudo-equivalents for \code{purrr} |
|||
\code{keep}/\code{discard}/\code{compact} |
|||
} |
|||
} |
@ -0,0 +1,18 @@ |
|||
% Generated by roxygen2: do not edit by hand |
|||
% Please edit documentation in R/use-mappers.R |
|||
\name{use_mappers} |
|||
\alias{use_mappers} |
|||
\title{Use base-ified equivalents of 'map'-pers} |
|||
\usage{ |
|||
use_mappers(save_as = "R/utils-mappers.R", open = TRUE) |
|||
} |
|||
\arguments{ |
|||
\item{save_as}{Where to save/what to name the file. Defaults to "\code{R/utils-mappers.R}"} |
|||
|
|||
\item{open}{if \code{TRUE}, open the resultant file} |
|||
} |
|||
\description{ |
|||
\itemize{ |
|||
\item Creates \code{R/utils-mappers.R} with base R pseudo-equivalents for \code{purrr} \code{map}-pers. |
|||
} |
|||
} |
@ -0,0 +1,18 @@ |
|||
% Generated by roxygen2: do not edit by hand |
|||
% Please edit documentation in R/use-safely.R |
|||
\name{use_safely} |
|||
\alias{use_safely} |
|||
\title{Use base-ified equivalents of "safely"-ifiers} |
|||
\usage{ |
|||
use_safely(save_as = "R/utils-safely.R", open = TRUE) |
|||
} |
|||
\arguments{ |
|||
\item{save_as}{Where to save/what to name the file. Defaults to "\code{R/utils-safely.R}"} |
|||
|
|||
\item{open}{if \code{TRUE}, open the resultant file} |
|||
} |
|||
\description{ |
|||
\itemize{ |
|||
\item Creates \code{R/utils-safely.R} with base R pseudo-equivalents for \code{purrr} \code{safely} (et al). |
|||
} |
|||
} |
@ -0,0 +1,2 @@ |
|||
library(testthat) |
|||
test_check("freebase") |
@ -0,0 +1,6 @@ |
|||
context("minimal package functionality") |
|||
test_that("we can do something", { |
|||
|
|||
#expect_that(some_function(), is_a("data.frame")) |
|||
|
|||
}) |
Loading…
Reference in new issue