Coder Social home page Coder Social logo

pkgdepends's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

pkgdepends's Issues

Handle when `options(repos = c(CRAN="@CRAN@"))`

library(pkgdepends)
r <- remotes$new(c("ggplot2"))$resolve()
#> Getting ‘@CRAN@/bin/macosx/el-capitan/contrib/3.4/PACKAGES.gz’
#> Getting ‘@CRAN@/src/contrib/PACKAGES.gz’
#> Getting ‘@CRAN@/src/contrib/Meta/archive.rds’
#> Error in def_get_value(self, private) : Could not resolve host: CRAN@

Possibly just set the CRAN repo to https://cloud.r-project.org if it is unset?

Downloads don't seem to exist on first call to `download_solution()`

unlink(pkgdepends:::detect_package_cache_dir(), recursive=T)
remove.packages("tidyverse")
remove.packages("foreign")
r <- pkgdepends::remotes$new("tidyverse", library = .libPaths()[[1]])
r$solve()
#> ✔ Resolving dependencies
#> # A tibble: 58 x 16
#>    ref   type  dire… stat… pack… vers… plat… rver… repo… sour… targ… full…
#>    <chr> <chr> <lgl> <chr> <chr> <chr> <chr> <chr> <chr> <S3:> <chr> <chr>
#>  1 inst… inst… F     OK    sele… 0.3-1 *     3.4   <NA>  char… <NA>  /var…
#>  2 inst… inst… F     OK    mnor… 1.5-5 x86_… 3.4   <NA>  char… <NA>  /var…
#>  3 inst… inst… F     OK    broom 0.4.2 *     3.4   <NA>  char… <NA>  /var…
#>  4 inst… inst… F     OK    plyr  1.8.4 x86_… 3.4   <NA>  char… <NA>  /var…
#>  5 inst… inst… F     OK    pill… 0.0.… *     3.4   <NA>  char… <NA>  /var…
#>  6 inst… inst… F     OK    asse… 0.2.0 *     3.4   <NA>  char… <NA>  /var…
#>  7 inst… inst… F     OK    tidyr 0.7.2 x86_… 3.4   <NA>  char… <NA>  /var…
#>  8 inst… inst… F     OK    xml2  1.1.1 x86_… 3.4   <NA>  char… <NA>  /var…
#>  9 inst… inst… F     OK    stri… 1.2.0 *     3.4   <NA>  char… <NA>  /var…
#> 10 inst… inst… F     OK    MASS  7.3-… x86_… 3.4   <NA>  char… <NA>  /var…
#> # ... with 48 more rows, and 4 more variables: dependencies <S3: AsIs>,
#> #   remote <list>, res_id <int>, res_file <int>
res <- r$download_solution()
file.exists(res[res$type != "installed", "fulltarget", drop=T])
#> [1] FALSE FALSE
res <- r$download_solution()
file.exists(res[res$type != "installed", "fulltarget", drop=T])
#> [1] TRUE TRUE

Not sure why this happens, and only seems to happen for pkgs which are not already in the package cache, but running download_solution a second time the does move the files appropriately.

Better automatic cache location.

Currently you need to supply the cache directory where the packages are downloaded, the default is a temporary directory. This is probably wrong, and we need an OS specific location, in the user’s cache dir. But this is tricky, because multiple pkgdepends instances might be running at the same time. For the package files, this is not a problem, but we need to coordinate caching the CRAN (etc) metadata, so that a resolution is consistent, i.e. the same metadata is used for everything.

Consider local packages

I.e. if a package is already installed locally, we don't need to download it.

Optionally, because for repoman we do want to download it.

local packages are marked as type binary even if they are source packages.

Here I would have expected padr to have a FALSE value for binary. This seems to happen for all local remotes.

library(pkgdepends)
download.packages("padr", type = "source", destdir = "/tmp")
#>      [,1]   [,2]                    
#> [1,] "padr" "/tmp/padr_0.3.0.tar.gz"
r <- remotes$new("local::/tmp/padr_0.3.0.tar.gz", library = tempdir())
r$solve()
#> ✔ Resolving dependencies
#> # A tibble: 14 x 16
#>    ref   type  dire… stat… pack… vers… plat… rver… repo… sour… targ… full…
#>    <chr> <chr> <lgl> <chr> <chr> <chr> <chr> <chr> <chr> <S3:> <chr> <chr>
#>  1 loca… local T     OK    padr  0.3.0 *     *     src/… /tmp… src/… /var…
#>  2 R6    stan… F     OK    R6    2.2.2 macos 3.4   bin/… http… bin/… /var…
#>  3 magr… stan… F     OK    magr… 1.5   macos 3.4   bin/… http… bin/… /var…
#>  4 asse… stan… F     OK    asse… 0.2.0 macos 3.4   bin/… http… bin/… /var…
#>  5 plogr stan… F     OK    plogr 0.1-1 macos 3.4   bin/… http… bin/… /var…
#>  6 bind… stan… F     OK    bind… 0.2   macos 3.4   bin/… http… bin/… /var…
#>  7 glue  stan… F     OK    glue  1.2.0 macos 3.4   bin/… http… bin/… /var…
#>  8 dplyr stan… F     OK    dplyr 0.7.4 macos 3.4   bin/… http… bin/… /var…
#>  9 tibb… stan… F     OK    tibb… 1.3.4 macos 3.4   bin/… http… bin/… /var…
#> 10 Rcpp  stan… F     OK    Rcpp  0.12… macos 3.4   bin/… http… bin/… /var…
#> 11 rlang stan… F     OK    rlang 0.1.4 macos 3.4   bin/… http… bin/… /var…
#> 12 pkgc… stan… F     OK    pkgc… 2.0.1 macos 3.4   bin/… http… bin/… /var…
#> 13 BH    stan… F     OK    BH    1.65… macos 3.4   bin/… http… bin/… /var…
#> 14 bindr stan… F     OK    bindr 0.1   macos 3.4   bin/… http… bin/… /var…
#> # ... with 4 more variables: dependencies <S3: AsIs>, remote <list>,
#> #   res_id <int>, res_file <int>
r$download_resolution()
#> # A tibble: 27 x 19
#>    ref   type  dire… stat… pack… vers… plat… rver… repo… sour… targ… full…
#>    <chr> <chr> <lgl> <chr> <chr> <chr> <chr> <chr> <chr> <S3:> <chr> <chr>
#>  1 loca… local T     OK    padr  0.3.0 *     *     src/… /tmp… src/… /var…
#>  2 R6    stan… F     OK    R6    2.2.2 macos 3.4   bin/… http… bin/… /var…
#>  3 R6    stan… F     OK    R6    2.2.2 sour… *     src/… "c(\… src/… /var…
#>  4 magr… stan… F     OK    magr… 1.5   macos 3.4   bin/… http… bin/… /var…
#>  5 magr… stan… F     OK    magr… 1.5   sour… *     src/… "c(\… src/… /var…
#>  6 asse… stan… F     OK    asse… 0.2.0 macos 3.4   bin/… http… bin/… /var…
#>  7 asse… stan… F     OK    asse… 0.2.0 sour… *     src/… "c(\… src/… /var…
#>  8 plogr stan… F     OK    plogr 0.1-1 macos 3.4   bin/… http… bin/… /var…
#>  9 plogr stan… F     OK    plogr 0.1-1 sour… *     src/… "c(\… src/… /var…
#> 10 bind… stan… F     OK    bind… 0.2   macos 3.4   bin/… http… bin/… /var…
#> # ... with 17 more rows, and 7 more variables: dependencies <S3: AsIs>,
#> #   remote <list>, res_id <int>, res_file <int>, download_status <chr>,
#> #   bytes <dbl>, errors <S3: AsIs>
plan <- r$get_install_plan()
plan[plan$package == "padr", "binary"]
#> # A tibble: 1 x 1
#>   binary
#>   <lgl> 
#> 1 T

Error in returning the solution for dplyr

The original error (same as in the reproducible example below) by running

r <- pkgdepends::remotes$new("dplyr", library = .libPaths()[[1]])
r$solve()

This seems somewhat particular to my library (it works fine for library = tempdir()), but I have saved the intermediate resolution object (obtained at

res <- tibble::tibble(
as an RDS. dplyr.rds.gz (I had to gzip it so github would accept the file)

resolution <- readRDS("dplyr.rds")

getf <- function(f) {
  unlist(lapply(resolution, function(x) vcapply(x$files, "[[", f)))
}

getf("target")
#> Error in vapply(X, FUN, FUN.VALUE = character(1), ...) :
#>   values must be length 1,
#>  but FUN(X[[1]]) result is length 0

The issue seems to be in the pillar dependency, which has a length 0 'target'. It is a pinned remote in tibble

lapply(resolution, function(x) vapply(x$files, function(x) length(x$target), integer(1)))
#> $`installed::/Users/jhester/Library/R/3.4/library/crayon`
#> [1] 1
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/assertthat`
#> [1] 1
#> 
#> $Rcpp
#> [1] 1 1
#> 
#> $crayon
#> [1] 1 1
#> 
#> $dplyr
#> [1] 1 1
#> 
#> $assertthat
#> [1] 1 1
#> 
#> $BH
#> [1] 1 1
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/plogr`
#> [1] 1
#> 
#> $R6
#> [1] 1 1
#> 
#> $magrittr
#> [1] 1 1
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/Rcpp`
#> [1] 1
#> 
#> $rlang
#> [1] 1 1
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/bindrcpp`
#> [1] 1
#> 
#> $bindrcpp
#> [1] 1 1
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/magrittr`
#> [1] 1
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/dplyr`
#> [1] 1
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/rlang`
#> [1] 1
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/R6`
#> [1] 1
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/pkgconfig`
#> [1] 1
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/BH`
#> [1] 1
#> 
#> $`r-lib/pillar@df8b39e`
#> [1] 0
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/tibble`
#> [1] 1
#> 
#> $glue
#> [1] 1 1
#> 
#> $plogr
#> [1] 1 1
#> 
#> $pkgconfig
#> [1] 1 1
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/glue`
#> [1] 1
#> 
#> $`installed::/Users/jhester/Library/R/3.4/library/bindr`
#> [1] 1
#> 
#> $bindr
#> [1] 1 1
#> 
#> $tibble
#> [1] 1 1
traceback
Error in vapply(X, FUN, FUN.VALUE = character(1), ...) :
Async error: values must be length 1,
 but FUN(X[[1]]) result is length 0

  1 r$solve()
  2 remotes_solve(self, private)
  3 self$resolve()
  4 remotes_resolve(self, private)
  5 synchronise(self$async_resolve(progress_bar = progress_bar))
  6 await(expr)
  7 await_all(def)
  8 self$async_resolve(progress_bar = progress_bar)
  9 remotes_async_resolve(self, private, progress_bar)
  10 deferred_pool$new()
  11 .subset2(public_bind_env, "initialize")(...)
  12 deferred$new(function(resolve, reject) {
    private$resolve <- resolve
    private$reject <- reject
})
  13 .subset2(public_bind_env, "initialize")(...)
  14 def_init(self, private, action, on_progress, on_cancel, longstack)
  --------

  1 r$solve()
  2 remotes_solve(self, private)
  3 self$resolve()
  4 remotes_resolve(self, private)
  5 synchronise(self$async_resolve(progress_bar = progress_bar))
  6 await(expr)
  7 await_all(def)
  8 self$async_resolve(progress_bar = progress_bar)
  9 remotes_async_resolve(self, private, progress_bar)
  10 pool$when_complete()$then(function() {
    private$resolution$packages <- eapply(private$resolution$packages, get_async
_value)
})
  --------

  1 r$solve()
  2 remotes_solve(self, private)
  3 self$resolve()
  4 remotes_resolve(self, private)
  5 synchronise(self$async_resolve(progress_bar = progress_bar))
  6 await(expr)
  7 await_all(def)
  8 self$async_resolve(progress_bar = progress_bar)
  9 remotes_async_resolve(self, private, progress_bar)
  10 pool$when_complete()$then(function() {
    private$resolution$packages <- eapply(private$resolution$packages, get_async
_value)
})$then(function() private$dirty <- FALSE)
  --------

  1 r$solve()
  2 remotes_solve(self, private)
  3 self$resolve()
  4 remotes_resolve(self, private)
  5 synchronise(self$async_resolve(progress_bar = progress_bar))
  6 await(expr)
  7 await_all(def)
  8 self$async_resolve(progress_bar = progress_bar)
  9 remotes_async_resolve(self, private, progress_bar)
  10 pool$when_complete()$then(function() {
    private$resolution$packages <- eapply(private$resolution$packages, get_async
_value)
})$then(function() private$dirty <- FALSE)$then(function() {
    private$resolution$result <- private$resolution_to_df(private$resolution$pac
kages)
})
  --------

  1 func()
  2 private$resolution_to_df(private$resolution$packages)
  3 remotes__resolution_to_df(self, private, resolution)
  4 tibble::tibble(ref = ref, type = vcapply(remote, "[[", "type"), direct = ref
 %in% vcapply(remotes, "[[", "ref"), status = getf("status"), package = getf("pa
ckage"), version = getf("version"), platform = getf("platform"), rversion = getf
("rversion"), repodir = getf("dir"), sources = sources, target = getf("target"),
 fulltarget = file.path(private$config$cache_dir, getf("target")), dependencies
= deps, remote = remote, res_id = rep(seq_along(resolution), num_files), res_fil
e = res_file)
  5 as_tibble(lst_quos(xs, expand = TRUE))
  6 lst_quos(xs, expand = TRUE)
  7 eval_tidy(xs[[i]], unique_output)
  8 overscope_eval_next(overscope, expr)
  9 getf("target")
  10 unlist(lapply(resolution, function(x) vcapply(x$files, "[[", f)))
  11 lapply(resolution, function(x) vcapply(x$files, "[[", f))
  12 FUN(X[[i]], ...)
  13 vcapply(x$files, "[[", f)
  14 vapply(X, FUN, FUN.VALUE = character(1), ...)

Syntax for remotes where repo name / file name if different from package name.

cc @jimhester

To make dependency resolution easier.

We could put the optional package name to the front or the end of the string, maybe front is better. We also need a new separator for it. How about a single :? If there is no : then the package name must match the repo name or file name (for url or local remotes).

package:user/repo
package:github::user/repo
package:url::https://xy.com/filename_1.0.0.tar.gz

Another alternative to : is =. We could also change the order of the remote type and the package name, I don't mind:

package:user/repo
github::package:user/repo
url::package:https://xy.com/filename_1.0.0.tar.gz

It does not look very good, but this syntax should be rarely needed, anyway.

This is the current GitHub remote syntax:

    github = paste0(
      "^",
      ## Optional remote type
      "(?:github::)?",
      ## Username
      "(?<username>(?:[^/]+))/",
      ## Repo
      "(?<repo>[^/@#]+)",
      ## Subdirectory
      "(?:/(?<subdir>(?:[^@#]*[^@#/])/?))?",
      ## Commit / PR / Release
      github_detail,
      "$"
    )

where

  github_commitish_rx <- "(?:@(?<commitish>[^*].*))"
  github_pull_rx <- "(?:#(?<pull>[0-9]+))"
  github_release_rx <- "(?:@(?<release>[*]release))"
  github_detail <- sprintf(
    "(?:(?:%s)|(?:%s)|(?:%s))?",
    github_commitish_rx,
    github_pull_rx,
    github_release_rx
  )

Dependencies with Bioconductor dependencies cause an error

r <- pkgdepends::remotes$new("MM2Sdata", library = tempdir())
r$solve()
#> ✔ Resolving dependencies
#> Error: $ operator is invalid for atomic vectors
traceback
6: FUN(X[[i]], ...)
5: lapply(seq_len(num), depconds) at solve.R#89
4: remotes__create_lp_problem(self, private, pkgs) at remotes.R#169
3: private$create_lp_problem(pkgs) at solve.R#11
2: remotes_solve(self, private) at remotes.R#129
1: r$solve()

Test with all CRAN packages installed

If you have installed all CRAN packages, install.packages() takes an extremely long time to run. It would be good to test with pkgdepends to make the performance isn't too awful.

Solving an installation

I.e. take the resolution for the packages, and the already installed packages, and work out what exactly needs to be downloaded and installed.

This is a discrete optimization problem, linear programming, probably. These rules must hold:

  1. All dependency versions need to be satisfied.
  2. For each package we need to have exactly one version.
  3. For directly specified versions (and refs) we need exactly those.

These rules are to select exactly one solution, if multiple solutions satisfy the previous criteria:

  1. Already installed packages are preferred to packages that need to be downloaded.
  2. Binary packages are preferred to source packages.

We ignore base packages completely, and we also ignore recommended packages if they are installed in the system packages library.

This optimization problem corresponds to the default configuration. Alternative ones will be considered as well, e.g. to upgrade old packages to their newest available versions.

@jimhester Feedback welcome!

Interim spinner

When I do pkgman::pkg_install("rstudio/rmarkdown") there's a noticeable delay between pressing enter and seeing ✔ Resolving dependencies. Could we get an interim spinner there? (Or maybe just move the message earlier?)

Some bioc packages fail to resolve

r <- remotes$new(c("ExpressionView"),library = "/tmp/lib"); r$resolve()
  Resolving   [1/1]   deps: [35/37] 00:00:04Error in (function (e)  :subscript out of bounds

a b c d e
▪̩┈┈┈┈┈┈┈┈ r$resolve ()
▫̩̍┈┈┈┈┈┈┈┈ pkgdepends::remotes_resolve (self, private) @ R/remotes.R:111:15
▫̩̍┈┈┈┈┈┈┈┈ private$with_progress_bar (list(type = "resolution", total = length(private$@ R/resolution.R:6:3
▫̩̍┈┈┈┈┈┈┈┈ pkgdepends::remotes__with_progress_bar (self, private, args, expr) @ R/remotes.R:166:25
▫̩̍┈┈┈┈┈┈┈┈ async::synchronise (self$async_resolve()) @ R/progress-bar.R:5:3
▫̩̍┈┈┈┈┈┈┈┈ self$async_resolve ()
▫̩̍┈┈┈┈┈┈┈┈ pkgdepends::remotes_async_resolve (self, private) @ R/remotes.R:109:21
▫̩̍┈┈┈┈┈┈┈┈ deferred_pool_generator::deferred_pool$new () @ R/resolution.R:26:3
▫̩̍⇢▪┈┈┈┈┈┈ ★ .subset2(public_bind_env, "initialize") (...)
▫̩̍┈┈⇢▪┈┈┈┈ ★ pool$when_complete()$then (function() {private$resolution$packages <- eapply@ R/resolution.R:30:3
▫̩̍┈┈┈┈⇢▪┈┈ ★ pool$when_complete()$then(function() {
    private$resolution$packages <- eapply(private$resolution$packages,
        get_async_value)
})$then (function() private$dirty <- FALSE) @ R/resolution.R:30:3
▫̍┈┈┈┈┈┈⇢▪̩ ★ pool$when_complete()$then(function() {
    private$resolution$packages <- eapply(private$resolution$packages,
        get_async_value)
})$then(function() private$dirty <- FALSE)$then (function() {private$resolution$metadata$resolutio@ R/resolution.R:30:3
        ▫̩̍ ▶ pool$when_complete()$then(function() {
    private$resolution$packages <- eapply(private$resolution$packages,
        get_async_value)
})$then(function() private$dirty <- FALSE)$then (function() {private$resolution$metadata$resolutio@ R/resolution.R:30:3
        ▫̩̍ func ()
        ▫̩̍ base::func (value)
        ▫̍ (function (e)
{
    e$call <- record_stack()
    error <<- e
}) (structure(list(message = "subscript out of bounds…

local remotes without dependencies fail

pkg <- "twoStageGwasPower"
location <- download.packages(pkg, type = "source", destdir = "/tmp/cache")[, 2]
r <- pkgdepends::remotes$new(paste0("local::", location), library = tempdir())
r$solve()
#> ✔ Resolving dependencies
#> Warning in seq_len(nrow(deps)): first element used of 'length.out' argument
#> Error in seq_len(nrow(deps)): argument must be coercible to non-negative integer

Test cases

Files:

  • type-bioc.R
  • type-cran.R
  • type-github.R
  • assertions.R
  • versions.R
  • metadata-cache.R
  • progress-bar.R
  • print.R
  • unzip.R
  • tree.R
  • cache-api.R
  • integrity.R
  • type-local.R

bioc remote

By and large we need to

  • have a mapping from R version to BioC version
  • cache the BioC metadata
  • use the package cache, it should be good as it is
  • autodetect whether a package is from CRAN or BioC, in dependencies

More general package cache

It could just support arbitrary fields. E.g. GH remotes would need user, repo, sha, etc., local remotes maybe a file modification date and/or md5, etc.

Tree drawing from the solution, optionally

Solution makes more sense, since that has a single version for each package, and we can also annotate it nicely:

  • status: installed, need to download, in cache, need to build, etc.
  • version
  • bytes to download
  • directly or indirectly required

???

Tibble error when resolving dependencies

r <- pkgdepends::remotes$new("synbreedData", library = tempdir())
r$resolve()
#> Error: Columns 1, 3 must be named
Traceback
23: stop(cnd) at cnd.R#318
22: abort(paste0(...)) at utils.r#42
21: stopc(pluralise_msg("Column(s) ", vars), " ", pluralise(problem,
        vars)) at tibble.R#144
20: invalid_df("must be named", x, which(bad_name)) at tibble.R#92
19: check_tibble(x) at as_tibble.R#97
18: list_to_tibble(x, validate, raw_rownames(x)) at as_tibble.R#72
17: as_tibble.data.frame(matrixToDataFrame(x), ..., rownames = rownames) at as_tibble.R#59
16: as_tibble(matrixToDataFrame(x), ..., rownames = rownames) at as_tibble.R#114
15: as_tibble.matrix(do.call(rbind, res), stringsAsFactors = FALSE) at as_tibble.R#59
14: as_tibble(do.call(rbind, res), stringsAsFactors = FALSE) at type-cran.R#294
13: get_all_package_dirs(platforms, rversions) at type-cran.R#104
12: update_cache(cache, rootdir = config$metadata_cache_dir, platforms = config$platforms,
        rversions = config$`r-versions`, mirror = config$`cran-mirror`) at type-cran.R#42
11: resolve_remote.remote_ref_cran(rem, config = private$config,
        cache = cache) at type.R#8
10: resolve_remote(rem, config = private$config, cache = cache) at resolution.R#73
9: remotes__resolve_ref(self, private, rem, pool) at remotes.R#159
8: FUN(X[[i]], ...)
7: lapply(private$remotes, private$resolve_ref, pool = pool) at resolution.R#28
6: remotes_async_resolve(self, private, progress_bar) at remotes.R#115
5: self$async_resolve(progress_bar = progress_bar) at await.R#43
4: await_all(def) at await.R#24
3: await(self$async_resolve(progress_bar = progress_bar)) at resolution.R#13
2: remotes_resolve(self, private) at remotes.R#117
1: r$resolve()
Session info
devtools::session_info()
#> ─ Session info ──────────────────────────────────────────────────────────
#>  setting  value                                      
#>  version  R version 3.4.1 Patched (2017-08-06 r73048)
#>  os       macOS Sierra 10.12.6                       
#>  system   x86_64, darwin15.6.0                       
#>  ui       X11                                        
#>  language (EN)                                       
#>  collate  en_US.UTF-8                                
#>  tz       America/New_York                           
#>  date     2017-10-11                                 
#> 
#> ─ Packages ──────────────────────────────────────────────────────────────
#>  package     * version     date      
#>  assertthat    0.2.0       2017-04-11
#>  async         0.0.0.9000  2017-10-09
#>  backports     1.1.1       2017-09-25
#>  boxes         0.0.0.9000  2017-10-05
#>  clisymbols    1.2.0       2017-06-26
#>  crayon        1.3.4       2017-09-18
#>  curl          3.0         2017-10-06
#>  desc          1.1.1.9000  2017-10-03
#>  devtools      1.13.3.9000 2017-09-18
#>  digest        0.6.12      2017-01-27
#>  evaluate      0.10.1      2017-06-24
#>  filelock      0.0.0.9000  2017-09-13
#>  glue          1.1.1.9000  2017-10-10
#>  hms           0.3         2016-11-22
#>  htmltools     0.3.6       2017-04-28
#>  jsonlite      1.5         2017-06-01
#>  knitr         1.17.4      2017-10-06
#>  lpSolve       5.6.13      2015-09-19
#>  magrittr      1.5         2014-11-22
#>  memoise       1.1.0       2017-06-22
#>  pillar        0.0.0.9000  2017-10-05
#>  pkgbuild      0.0.0.9000  2017-08-31
#>  pkgdepends    0.0.0.9000  2017-10-11
#>  pkgload       0.0.0.9000  2017-09-18
#>  prettyunits   1.0.2       2015-07-13
#>  progress      1.1.2.9000  2017-10-09
#>  R6            2.2.2       2017-06-17
#>  rappdirs      0.3.1       2016-03-28
#>  Rcpp          0.12.13     2017-09-28
#>  rematch2      2.0.1       2017-06-20
#>  rlang         0.1.2.9000  2017-09-27
#>  rmarkdown     1.6         2017-06-15
#>  rprojroot     1.2         2017-01-16
#>  sessioninfo   1.0.1       2017-08-15
#>  stringi       1.1.5       2017-04-07
#>  stringr       1.2.0       2017-02-18
#>  tibble        1.3.4.9001  2017-10-05
#>  usethis       0.1.0       2017-10-06
#>  uuid          0.1-2       2015-07-28
#>  withr         2.0.0       2017-09-19
#>  yaml          2.1.14      2016-11-12
#>  source                                 
#>  CRAN (R 3.4.0)                         
#>  Github (r-lib/async@f66470c)           
#>  CRAN (R 3.4.2)                         
#>  Github (r-lib/boxes@73f2f0d)           
#>  Github (gaborcsardi/clisymbols@e49b4f5)
#>  Github (gaborcsardi/crayon@b5221ab)    
#>  CRAN (R 3.4.2)                         
#>  Github (r-lib/desc@b61383d)            
#>  Github (hadley/devtools@a0c8d73)       
#>  CRAN (R 3.4.0)                         
#>  CRAN (R 3.4.1)                         
#>  Github (r-lib/filelock@6e6b5df)        
#>  local (tidyverse/glue@NA)              
#>  CRAN (R 3.4.0)                         
#>  CRAN (R 3.4.0)                         
#>  CRAN (R 3.4.0)                         
#>  Github (yihui/knitr@0dec03b)           
#>  CRAN (R 3.4.0)                         
#>  CRAN (R 3.4.0)                         
#>  Github (hadley/memoise@d63ae9c)        
#>  Github (r-lib/pillar@065c658)          
#>  Github (r-pkgs/pkgbuild@6574561)       
#>  Github (r-lib/pkgdepends@92aceb0)      
#>  Github (r-lib/pkgload@7fd5f55)         
#>  CRAN (R 3.4.0)                         
#>  Github (r-lib/progress@6c98723)        
#>  CRAN (R 3.4.0)                         
#>  CRAN (R 3.4.0)                         
#>  CRAN (R 3.4.2)                         
#>  CRAN (R 3.4.1)                         
#>  Github (tidyverse/rlang@c6b038f)       
#>  CRAN (R 3.4.0)                         
#>  CRAN (R 3.4.0)                         
#>  Github (r-lib/sessioninfo@e813de4)     
#>  CRAN (R 3.4.0)                         
#>  CRAN (R 3.4.0)                         
#>  Github (tidyverse/tibble@0ecd918)      
#>  Github (r-lib/usethis@8a00ce7)         
#>  CRAN (R 3.4.0)                         
#>  Github (r-lib/withr@d1f0957)           
#>  CRAN (R 3.4.0)

Sorry the session info looks so bad, I generated it using reprex and the width is apparently too small :/

I am not sure if this is a bug in devel tibble or something wrong in pkgdepends. I am using tidyverse/tibble@0ecd918.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.