r-lib / pkgdepends Goto Github PK
View Code? Open in Web Editor NEWR Package Dependency Resolution
Home Page: https://r-lib.github.io/pkgdepends/
License: Other
R Package Dependency Resolution
Home Page: https://r-lib.github.io/pkgdepends/
License: Other
For one or more packages.
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?
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.
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.
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.
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
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
Line 147 in 92aceb0
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
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), ...)
Either via the standard
ref type, or a new ref type?
To make sure that their correct dependencies are installed.
We can do this as a separate step after the resolution, or in parallel with that.
Instead of swallowing them....
Right now we are trying to install them into the target library, which is probably not good.
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
)
r <- pkgdepends::remotes$new("MM2Sdata", library = tempdir())
r$solve()
#> ✔ Resolving dependencies
#> Error: $ operator is invalid for atomic vectors
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()
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.
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:
These rules are to select exactly one solution, if multiple solutions satisfy the previous criteria:
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!
Right now the file
column of a installation plan is set to a cache directory/NA, e.g. "/var/folders/dt/r5s12t392tb5sk181j3gs4zw0000gn/T//Rtmp923JLv/filea46714824832/NA"
. It would be more informative if this was the path the package was installed to.
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?)
❯ 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…
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
Currently only the first version is added, and a warning is printed. All versions should be added, and we select based on platform and R version requirements, defaulting to the latest version.
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
By and large we need to
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.
What conflicts prevent the installation of a package?
and versioned install. I.e. specify pkg@version
and get that version from release
, or fall back to rolling
.
This can be either based on some implicit repo order, or some explicit priorities.
I.e. everything for direct dependencies, and hard ones only for indirect ones.
The data.frame has a target
column that contains the relative path, it would be convenient to have the full path as well.
Solution makes more sense, since that has a single version for each package, and we can also annotate it nicely:
???
and rule out packages that are not compatible with it.
I.e. if a resolution / download fails, what other dependent packages are affected.
Keep it in memory.
r <- pkgdepends::remotes$new("synbreedData", library = tempdir())
r$resolve()
#> Error: Columns 1, 3 must be named
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()
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.
E.g. by overriding a dependency version.
Include:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.