Giter Site home page Giter Site logo

tourr's Introduction

GGobi is an interactive, direct manipulation tool for visualizing high-dimensional data across linked plots. The GUI is built using Gtk+. It reads data in regular ASCII format and more richly using an XML format. Plugins for other formats are also available.

Build and install

./bootstrap
./configure
make
make install

tourr's People

Contributors

astamm avatar dicook avatar emitanaka avatar hadley avatar huizezhang-sherry avatar robjhyndman avatar talgalili avatar uschilaa avatar yihui avatar

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

Watchers

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

tourr's Issues

render and render_gif broken

It looks like the implementation of the verbose argument is not working for these functions, running the examples I get

render(flea[, 1:4], grand_tour(), display_xy(), "pdf", "test.pdf")
Converting input data to the required matrix format.
Error in tour_path(proj, data, ...) : object 'verbose' not found

gif_file <- file.path(tempdir(), "test.gif")
render_gif(flea[, 1:4], grand_tour(), display_xy(), gif_file )
Converting input data to the required matrix format.
Error in tour_path(proj, data, ...) : object 'verbose' not found

add tests

starting from examples, create some testhat cases where expected can be specified

render_gif broken

gif_file <- file.path(tempdir(), "test.gif")
render_gif(flea[, 1:4], grand_tour(), display_xy(), gif_file )
Converting input data to the required matrix format.
Error in tour(0) : object 'verbose' not found

Frame interpolation instead of plane interpolation question

First I wanted to thank you for the package, I really like it.

My question is about whether geodesic frame interpolation is available along the Stiefel manifold. In the paper:

COOK, ANDREAS BUJA1 DIANNE, DANIEL ASIMOV, and CATHERINE HURLEY. "Theory and computational methods for dynamic projections in high-dimensional data visualization." Journal of computational and graphical statistics (1997).

A variety of algorithms are given for interpolating either frames or planes in ways that e.g. minimizes or maximizes "whip spin" and other quantities related to the derivatives of frame/plane motion, etc. Looking at the code in geodesic_info, tourr seems to implement the zero whip-spin interpolation between planes outlined in section 12 of the paper. I was wondering if tourr implemented somewhere in the package one of the frame-interpolation strategies, e.g. like the one give in 13.2 that uses Givens rotations?

Problem with search_better(_random)

The "Old" basis currently does not get updated when a better view is found, so the optimisation does not work. This is an issue with both search_better and search_better_random.

Example:

animate_xy(flea[, 1:6], guided_tour(index_f=holes(), search_f = search_better))
Converting input data to the required matrix format.
Press Esc to stop tour running
Old 0.2796075
New 0.4904893 try 1
Using half_range 0.98
Old 0.2796075
New 0.4442945 try 1
Old 0.2796075
New 0.6781696 try 1
Old 0.2796075
New 0.6784749 try 1
Old 0.2796075
New 0.4289371 try 1

save_history broken for guided tour

The global object "record" is defined in animate() but not save_history(), this leads to an error, e.g. when calling:

save_history(flea[, 1:6], guided_tour(holes()), max = 3)
Converting input data to the required matrix format.
Error in nrow(record) : object 'record' not found

Error when using render with guided tour

Here is a small example and the error it produces for me

tmp_path <- tempdir()
render(flea[, 1:6], guided_tour(holes()), display_xy(), "pdf", frames = 3, file.path(tmp_path, "test.pdf") )
Converting input data to the required matrix format.
target_dist - cur_dist: 0
Fehler in integer(n) : Vektorgröße kann nicht NA/NaN sein
Zusätzlich: Warnmeldung:
In integer(n) : NAs durch Umwandlung erzeugt

Issues with search polish

  • It looks like we can set n_sample but this is not being used, so currently it only samples a small number of planes.
  • Breaks when tourr.verbose is not set, example:

animate_xy(flea[, 1:3], guided_tour(holes(), search_f = search_polish))
Converting input data to the required matrix format.
Press Esc to stop tour running
alpha gets updated to 0.475
better basis found, index_val = 0.4812705
alpha gets updated to 0.4286875
alpha gets updated to 0.3675459
alpha gets updated to 0.2993685
alpha gets updated to 0.2316456
alpha gets updated to 0.1702808
alpha gets updated to 0.1189134
better basis found, index_val = 0.4816502
alpha gets updated to 0.07888961
alpha gets updated to 0.04972013
better basis found, index_val = 0.481752
alpha gets updated to 0.02976928
better basis found, index_val = 0.4817625
better basis found, index_val = 0.4817818
alpha gets updated to 0.01693277
alpha gets updated to 0.009149792
alpha is 0.009149792 and it is too small!
Error in if (getOption("tourr.verbose")) { : argument is of length zero

save_history() doesn't change based on supplied start basis.

remotes::install_github("ggobi/tourr") # Latest dev ver
#> Skipping install of 'tourr' from a github remote, the SHA1 (b7995b16) has not changed since last install.
#>   Use `force = TRUE` to force installation
library("tourr")
install.packages("reprex")
#> Installing package into 'C:/Users/Nicholas Spyrison/Documents/R/win-library/3.6'
#> (as 'lib' is unspecified)
#> package 'reprex' successfully unpacked and MD5 sums checked
#> 
#> The downloaded binary packages are in
#>  C:\Users\Nicholas Spyrison\AppData\Local\Temp\RtmpUN6dDF\downloaded_packages
library("reprex")
#> Warning: package 'reprex' was built under R version 3.6.2
###

dat    <- tourr::rescale(tourr::flea[, 1:6])
bas    <- prcomp(dat)$rotation[, 1:2]

cat("Issue: save_history()'s first basis no where close to supplied start basis: \n")
#> Issue: save_history()'s first basis no where close to supplied start basis:
tpath  <- save_history(data = dat, tour_path = grand_tour(), max_bases = 2, start = bas)
b1 <- matrix(tpath[,, 1], ncol = 2, byrow = F)
b1 - bas
#>               PC1        PC2
#> tars1  0.02123195 -0.4537362
#> tars2 -0.02394871 -0.1004713
#> head  -1.05658118 -0.1691590
#> aede1 -0.52947156 -1.0148490
#> aede2  0.10620174 -0.7070230
#> aede3 -0.58455757  0.5143540

cat("Related, but working: however, animate() does start at ssupplied start basis: \n")
#> Related, but working: however, animate() does start at ssupplied start basis:
animate(dat, tour_path = grand_tour(), start = bas, max_frames = 0)
#> Using half_range 0.98

Created on 2020-03-04 by the reprex package (v0.3.0)

getting ready for release

  • remove util.pipe.r
  • import only dplyr
  • several small vignettes (basic tour methods, collected from examples)
  • add pkdown stuff into R BUILD ignore

CITATION

It would be good to add Ursula's new slice paper to the CITATION file. Can you do this @uschiLaa ?

only one is published yet, but hopefully a couple more can be added soon.

proj_dist

From Catherine Hurley: "It is definitely a documentation bug. It is probably also a code bug because I would think what the proj_dist should be is the norm of the sines of the principal angles. This is what is in the paper referred to, by Andreas et al."

render is broken too

render(flea[, 1:4], grand_tour(), display_xy(), "png", "test-%03d.png")
Converting input data to the required matrix format.
Error in if (verbose) cat("target_dist - cur_dist:", target_dist - cur_dist, :
argument is not interpretable as logical

is_orthonormal() is wrong in some cases.

remotes::install_github("ggobi/tourr") # Latest dev ver
#> Skipping install of 'tourr' from a github remote, the SHA1 (b7995b16) has not changed since last install.
#>   Use `force = TRUE` to force installation
library("tourr")
install.packages("reprex")
#> Installing package into 'C:/Users/Nicholas Spyrison/Documents/R/win-library/3.6'
#> (as 'lib' is unspecified)
#> package 'reprex' successfully unpacked and MD5 sums checked
#> 
#> The downloaded binary packages are in
#>  C:\Users\Nicholas Spyrison\AppData\Local\Temp\Rtmpa09vQW\downloaded_packages
library("reprex")
#> Warning: package 'reprex' was built under R version 3.6.2

a <- diag(4) 
dat <- tourr::rescale(tourr::flea[, 1:6])
b <- prcomp(dat)$rotation[, 1:2]
c <- basis_random(5)
d <- matrix(runif(n = 8), ncol=2)

is_orthonormal(a) ## Expecting T; WRONG
#> [1] FALSE
is_orthonormal(b) ## Expecting T; correct
#> [1] TRUE
is_orthonormal(c) ## Expecting T; correct
#> [1] TRUE
is_orthonormal(d) ## Expecting F; correct
#> [1] FALSE


## Suggested fix:
suggested_is_orthogonal <- function(x, tol = 0.001) {
  stopifnot(is.matrix(x))
  
  actual <- t(x) %*% x ## Collapses to identity matrix IFF x is orthonormal
  expected <- diag(ncol(x))
  
  if (max(actual - expected) < tol) {TRUE} else {FALSE}
}

suggested_is_orthogonal(a) ## Expecting T; correct
#> [1] TRUE
suggested_is_orthogonal(b) ## Expecting T; correct
#> [1] TRUE
suggested_is_orthogonal(c) ## Expecting T; correct
#> [1] TRUE
suggested_is_orthogonal(d) ## Expecting F; correct
#> [1] FALSE

Created on 2020-03-04 by the reprex package (v0.3.0)

render_gif generates an error when generated frames are less than the frames argument specified

An error with render_gif():

library(tourr)
set.seed(123)
gif_file <- file.path(tempdir(), "test.gif")
tourr::render_gif(
  flea[1:6],
  tour_path = guided_tour(holes()),
  display = display_xy(),
  frames = 70,
  gif_file = gif_file
)
#> Converting input data to the required matrix format.
#> Value  0.538   43.4 % better  - NEW BASIS
#> Using half_range 0.98
#> Value  0.730   35.6 % better  - NEW BASIS
#> Value  0.780   6.8 % better  - NEW BASIS
#> Value  0.846   8.5 % better  - NEW BASIS
#> Value  0.872   3.2 % better  - NEW BASIS
#> Value  0.883   1.3 % better  - NEW BASIS
#> Value  0.887   0.4 % better  - NEW BASIS
#> Value  0.891   0.5 % better  - NEW BASIS
#> Value  0.897   0.7 % better  - NEW BASIS
#> Value  0.903   0.7 % better  - NEW BASIS
#> Value  0.906   0.3 % better  - NEW BASIS
#> Value  0.906   0.0 % better 
#> Value  0.910   0.5 % better  - NEW BASIS
#> Value  0.910   0.0 % better 
#> Value  0.912   0.3 % better  - NEW BASIS
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.1 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.1 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.1 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.1 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> No better bases found after 25 tries.  Giving up.
#> Final projection: 
#> 0.333  0.486  
#> 0.338  -0.344  
#> 0.412  -0.189  
#> 0.381  -0.337  
#> 0.467  0.644  
#> 0.492  -0.285
#> Error in normalizePath(png_files, mustWork = TRUE): path[61]="/var/folders/_t/v9kjp3yn2k73wm16y_jlphgsbbd6_6/T//Rtmph3qiEy/frame061.png": No such file or directory

Created on 2022-10-06 by the reprex package (v2.0.1)

This is because only 60 frames are generated with this guided tour configeration while 70 frames are asked to be rendered. This can be validated by usingtourr::render():

library(tourr)
set.seed(123)
png_files <- file.path(tempdir(), "test-%03d.png")
tourr::render(
  data = flea[,1:6],
  tour_path = guided_tour(holes()),
  display = display_xy(),
  frames = 100, "png",
  png_files)
#> Converting input data to the required matrix format.
#> Value  0.538   43.4 % better  - NEW BASIS
#> Using half_range 0.98
#> Value  0.730   35.6 % better  - NEW BASIS
#> Value  0.780   6.8 % better  - NEW BASIS
#> Value  0.846   8.5 % better  - NEW BASIS
#> Value  0.872   3.2 % better  - NEW BASIS
#> Value  0.883   1.3 % better  - NEW BASIS
#> Value  0.887   0.4 % better  - NEW BASIS
#> Value  0.891   0.5 % better  - NEW BASIS
#> Value  0.897   0.7 % better  - NEW BASIS
#> Value  0.903   0.7 % better  - NEW BASIS
#> Value  0.906   0.3 % better  - NEW BASIS
#> Value  0.906   0.0 % better 
#> Value  0.910   0.5 % better  - NEW BASIS
#> Value  0.910   0.0 % better 
#> Value  0.912   0.3 % better  - NEW BASIS
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.1 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.1 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.1 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.1 % better 
#> Value  0.913   0.0 % better 
#> Value  0.913   0.0 % better 
#> No better bases found after 25 tries.  Giving up.
#> Final projection: 
#> 0.333  0.486  
#> 0.338  -0.344  
#> 0.412  -0.189  
#> 0.381  -0.337  
#> 0.467  0.644  
#> 0.492  -0.285
length(list.files(tempdir()))
#> [1] 60

Created on 2022-10-06 by the reprex package (v2.0.1)

pkgdown

Should we follow these guidelines and shift the pkgdown files to a pkgdown directory?

"You can also put it in pkgdown/_pkgdown.yml if you want to keep the package root clutter free, or in inst/_pkgdown.yml if you want to make it available when your package is installed"

Global variables and reliance on global state

When running animate, the verbose and record objects get returned to the current R session even if the verbose argument is set to FALSE. This could cause user data (if they have an object called record in their global environment) to be overwritten by the tourr package which might be unexpected.

Moreover, the reliance on global state means that functions in the current version of tourr now don't work outside the context of animate. For example in #57, the render functions don't work because new_geodesic_path can't find a verbose object.

For the record keeping object it should only get initialised if verbose = TRUE.
The simplest solution to fix this would be add a verbose argument to all the functions where you wanted to do record keeping, like the search_* family of functions and the new_geoedesic_path function.

cc @huizezhang-sherry @uschiLaa

interpolate function is broken

Using the example code provided:

t1 <- save_history(flea[, 1:6], grand_tour(1), max = 10)
Converting input data to the required matrix format.
dim(t1)
[1] 6 1 10
dim(interpolate(t1, 0.01))
[1] 6 1 2

Starting with 10 bases, interpolate returns only two bases, and looking at the bases shows that it is the initial basis repeated twice:

interpolate(t1)
, , 1

        [,1]

[1,] 0.19811164
[2,] -0.53411260
[3,] 0.33825641
[4,] -0.68476359
[5,] -0.06762363
[6,] 0.29594589

, , 2

        [,1]

[1,] 0.19811164
[2,] -0.53411260
[3,] 0.33825641
[4,] -0.68476359
[5,] -0.06762363
[6,] 0.29594589

attr(,"new_basis")
[1] TRUE TRUE
attr(,"class")
[1] "history_array" "array"

package update

  • update version in DESCRIPTION
  • add sherry too author list

New `verbose` argument and record keeping

Hi @huizezhang-sherry,

The current version of tourr breaks my package sa-lee/liminal#11 as I require the use new_tour() without using animate or save history.

A simple fix would be adding the verbose argument to new_tour rather than relying on global variables. Happy to PR to make the necessary changes.

I'm a bit confused about the record keeping object you've got going on, this seems like something that's useful to you the developer but not something that would be necessary for the end user. Could you explain what's going on here? As far as I can tell this is just save_history with extra information? If the goal is better record keeping I really think this approach should be refactored out of the existing functions and into something new.

cc @uschiLaa @dicook

Unexpected behaviour in frozen_tour()

  1. works for some but not all variables
  2. Only seems to check the column norm, not the row (variable norm)
  3. see other comments in the example section, not run
require(tourr)
#> Loading required package: tourr
#> Warning: package 'tourr' was built under R version 4.0.5
?frozen_tour ## Also not the Not run: code and comments in the examples section.

#### Works for some variables but not others. ------
## Example case; expected success
frozen <- matrix(NA, nrow = 4, ncol = 2)
frozen[3, ] <- .5
if(interactive())
  animate_xy(flea[, 1:4], frozen_tour(2, frozen)) 

## Trivial variable change; unexpected error
frozen <- matrix(NA, nrow = 4, ncol = 2)
frozen[1, ] <- .5
animate_xy(flea[, 1:4], frozen_tour(2, frozen))
#> Converting input data to the required matrix format.
#> target_dist - cur_dist: 0 
#> generation:  dist =   1.815423
#> Error in svd(t(Fa) %*% Fz): infinite or missing values in 'x'

#### Check is column norm >1, also need to check row norm? ------
## Norm > 1; expected error
frozen <- matrix(NA, nrow = 4, ncol = 2)
frozen[3, ] <- 1.1 
animate_xy(flea[, 1:4], frozen_tour(2, frozen))
#> Converting input data to the required matrix format.
#> Error: Columns of frozen matrix must have squared norm < 1

## Norm > 1, variable contribution larger than 1; unexpected success
frozen <- matrix(NA, nrow = 4, ncol = 2)
frozen[3, ] <- .9
if(interactive())
  animate_xy(flea[, 1:4], frozen_tour(2, frozen))

## Norm > 1, each row < 1, but col norm > 1; expected error
frozen <- matrix(NA, nrow = 4, ncol = 2)
frozen[c(3, 4), ] <- .9
animate_xy(flea[, 1:4], frozen_tour(2, frozen))
#> Converting input data to the required matrix format.
#> Error: Columns of frozen matrix must have squared norm < 1

Created on 2021-04-12 by the reprex package (v1.0.0)

the ending basis in the interpolation

Currently, the ending basis of the interpolation is computed to extrapolate to 1 (line 83 in tour.r) but the last one is not stored. We might want to decide if this last one needs to be stored as well since doing so will match with the first basis in the next interpolation.

example usage for search_polish

Ideally we have some example code for search_polish() with this function

Could be nice to have example code for the other search functions too

olive data: Sicily seems to be in the wrong region

From the table below, it seems like the region variable for observations from Sicily should be
South rather than North. It is surprising that nobody caught this before.

> table(olive$area, olive$region)

                   North Sardinia South
  Calabria            56        0     0
  Coast-Sardinia       0       33     0
  East-Liguria         0        0    50
  Inland-Sardinia      0       65     0
  North-Apulia        25        0     0
  Sicily              36        0     0
  South-Apulia       206        0     0
  Umbria               0        0    51
  West-Liguria         0        0    50
>

little tour is broken

animate_xy(flea[, 1:6], little_tour())

Converting input data to the required matrix format.
Press Esc to stop tour running
Error in x %*% t(x) : requires numeric/complex matrix/vector arguments

guided_tour

Dear maintainer
I recently built a package based on tourr. After I update tourr to 0.6.0, the guided_tour does not work anymore. I checked my code, I think the reason comes from here:

> tour_path = tourr::guided_tour(tourr::holes())
> tour_path(NULL, iris[, -5])
Error: New rows can't add columns.
x Can't find columns `basis`, `index_val`, `info`, `method`, `alpha`, and 2 more in `.data`.

The reason may come from this line

rcd_env <- parent.frame(n = 3)
rcd_env[["record"]] <- dplyr::add_row(rcd_env[["record"]], 
    basis = list(current), index_val = cur_index, info = "new_basis", 
    method = method, alpha = formals(guided_tour)$alpha, tries = 1, 
    loop = 1)

If I call tour_path(NULL, iris[, -5]) in the global environment, rcd_env seems fail to locate the env.

no visible binding for '<<-' assignment

have problems with each of the global variables.

now think some more changes are needed:

(1) the search functions retun record still. I think these should be removed because record is being updated as a global variable

(2) tries appears to be used for multiple things, sometimes passed into a function, sometimes globally changed

optimisation notes

  • stepS in search_geodesic might be better to be large by default
  • add an optimisation which prohibits the neighbourhood of a given projection, to find multiple modes. Once a maximum has been found, don't look in this neighbourhood, force search away from (but not orthogonal).
  • add a derivative search, if indexes have a derivative function

frozen guided broken

search_frozen_geodesic() needs to have the same modifications as the search_geodesic()

add github actions

The website should be auto deployed from actions and I think would make it easier for us to check any breaking changes.

update Suggests

reshape2 is only used in the Andrew's path example - could it be removed? We also need to add extra packages for the new vignettes, like tsibble...

record object

could we make the record object a class?

see earo's tsibble?

something like save_history

news.md vs NEWS

I think there is a discrepancy between NEWS and news.md; should the NEWS be converted to news.md and just have one file?

Animations in Jupyter Notebook / Lab (with IRKernel) not working

Hi,

I have been trying to make animations work in Jupyter Notebook (using IRKernel) with no success. I believe the rendering loop just exists after the first iteration (tryCatch block?).

Below is a screenshot of the output:

image

Is there any way to make animations work in Jupyter (with IRKernel), or at least export animations to other formats?

When trying to use the animate library, for instance to saveGIF (inside the Jupyter Notebook), I get the same result: only the first frame is saved.

updates to README / documentation site

I think the README could use with a bit of an update:

  1. what a tourr is and why you should care about it.
  2. the section about Rstudio viewer is no longer relevant as well?

pkgdown deployment:

  1. deploy from github with actions to the gh-pages branch (will need to change this in the repo settings)
  2. categories functions into sections like: tour paths, optimisation and indexes, displays and animations, data, utils

Option tourr.verbose

Hi,

I'm currently using tourr programatically, and I've run in to some issues to do with logging and verbosity. What I'm doing is something like below

library(tourr)
tour = new_tour(flea[, 1:6], tour_path = grand_tour())
start=tour(0)
step_size = 1/10
projections = vector("list", 10)
for (i in 1:100) {
  projections[[i]] = tour(step_size)$proj
}

However, this code will fail with the following error after a few iterations:

Error in if ("new_basis" %in% rcd_env[["record"]]$info & rcd_env[["record"]]$method[2] !=  : 
  argument is of length zero

This is because in the file tour.R there is a call to parent.frame() that looks for an object called record in the parent environment, which doesn't exist.

Creating a data frame called record with the appropriate columns before running the loop above fixes this issue, but it will still fail if I try to use lapply() or purrr::map() instead of a for loop.

I see from the git history there was an option called tour.verbose , but this was removed in #96. I'd like to reinstate something similar---either an option or a function argument---to prevent the need for the record data frame and to suppress output to the console.

Is there a preferred way to implement this? I'm happy to contribute.

guided tour seems to be broken in 0.5.7

remotes::install_github("ggobi/tourr")
#> Using github PAT from envvar GITHUB_PAT
#> Skipping install of 'tourr' from a github remote, the SHA1 (26838bad) has not changed since last install.
#>   Use `force = TRUE` to force installation
library(tourr)

animate_xy(flea[, 1:6], guided_tour(cmass()))
#> Converting input data to the required matrix format.
#> Error in search_f(current, alpha, index, max.tries, cur_index = cur_index, : could not find function "search_f"

Created on 2020-09-30 by the reprex package (v0.3.0)

Session info
devtools::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.0.2 (2020-06-22)
#>  os       macOS Catalina 10.15.7      
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_AU.UTF-8                 
#>  ctype    en_AU.UTF-8                 
#>  tz       Australia/Melbourne         
#>  date     2020-09-30                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version date       lib source                      
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.0.2)              
#>  backports     1.1.9   2020-08-24 [1] CRAN (R 4.0.2)              
#>  callr         3.4.4   2020-09-07 [1] CRAN (R 4.0.2)              
#>  cli           2.0.2   2020-02-28 [1] CRAN (R 4.0.2)              
#>  crayon        1.3.4   2017-09-16 [1] CRAN (R 4.0.2)              
#>  curl          4.3     2019-12-02 [1] CRAN (R 4.0.1)              
#>  desc          1.2.0   2018-05-01 [1] CRAN (R 4.0.2)              
#>  devtools      2.3.1   2020-07-21 [1] CRAN (R 4.0.2)              
#>  digest        0.6.25  2020-02-23 [1] CRAN (R 4.0.2)              
#>  ellipsis      0.3.1   2020-05-15 [1] CRAN (R 4.0.2)              
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 4.0.1)              
#>  fansi         0.4.1   2020-01-08 [1] CRAN (R 4.0.2)              
#>  fs            1.5.0   2020-07-31 [1] CRAN (R 4.0.2)              
#>  glue          1.4.2   2020-08-27 [1] CRAN (R 4.0.2)              
#>  highr         0.8     2019-03-20 [1] CRAN (R 4.0.2)              
#>  htmltools     0.5.0   2020-06-16 [1] CRAN (R 4.0.2)              
#>  knitr         1.29    2020-06-23 [1] CRAN (R 4.0.2)              
#>  lifecycle     0.2.0   2020-03-06 [1] CRAN (R 4.0.2)              
#>  magrittr      1.5     2014-11-22 [1] CRAN (R 4.0.2)              
#>  memoise       1.1.0   2017-04-21 [1] CRAN (R 4.0.2)              
#>  pillar        1.4.6   2020-07-10 [1] CRAN (R 4.0.2)              
#>  pkgbuild      1.1.0   2020-07-13 [1] CRAN (R 4.0.2)              
#>  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.0.2)              
#>  pkgload       1.1.0   2020-05-29 [1] CRAN (R 4.0.2)              
#>  prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.0.2)              
#>  processx      3.4.4   2020-09-03 [1] CRAN (R 4.0.2)              
#>  ps            1.3.4   2020-08-11 [1] CRAN (R 4.0.2)              
#>  purrr         0.3.4   2020-04-17 [1] CRAN (R 4.0.2)              
#>  R6            2.4.1   2019-11-12 [1] CRAN (R 4.0.2)              
#>  remotes       2.2.0   2020-07-21 [1] CRAN (R 4.0.2)              
#>  rlang         0.4.7   2020-07-09 [1] CRAN (R 4.0.2)              
#>  rmarkdown     2.3     2020-06-18 [1] CRAN (R 4.0.2)              
#>  rprojroot     1.3-2   2018-01-03 [1] CRAN (R 4.0.2)              
#>  sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 4.0.2)              
#>  stringi       1.5.3   2020-09-09 [1] CRAN (R 4.0.2)              
#>  stringr       1.4.0   2019-02-10 [1] CRAN (R 4.0.2)              
#>  testthat      2.3.2   2020-03-02 [1] CRAN (R 4.0.2)              
#>  tibble        3.0.3   2020-07-10 [1] CRAN (R 4.0.2)              
#>  tourr       * 0.5.7   2020-09-30 [1] Github (ggobi/tourr@26838ba)
#>  usethis       1.6.1   2020-04-29 [1] CRAN (R 4.0.2)              
#>  vctrs         0.3.4   2020-08-29 [1] CRAN (R 4.0.2)              
#>  withr         2.2.0   2020-04-20 [1] CRAN (R 4.0.2)              
#>  xfun          0.17    2020-09-09 [1] CRAN (R 4.0.2)              
#>  yaml          2.2.1   2020-02-01 [1] CRAN (R 4.0.2)              
#> 
#> [1] /Library/Frameworks/R.framework/Versions/4.0/Resources/library

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.