Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make data/ directory automatically accessible to exercises #539

Merged
merged 70 commits into from
Jul 9, 2021
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
c16f532
Make files accessible to tutorials
rossellhayes Jun 12, 2021
86f32df
Handle cases where `data/` directory, `use_remote_files()`, and chunk…
rossellhayes Jun 14, 2021
f7e2cd3
Remove `strwrap()` (doesn't work in R Markdown pane)
rossellhayes Jun 14, 2021
e7f1f1f
Ensure remote files are either URLs or system.file()s
rossellhayes Jun 14, 2021
cbd3571
Namespace `utils::download.file()`
rossellhayes Jun 15, 2021
3380ae1
Simplify code with better return values
rossellhayes Jun 15, 2021
818fc45
Add `system.file()` examples
rossellhayes Jun 15, 2021
7c60243
Add tests for `use_remote_files()`
rossellhayes Jun 15, 2021
f691484
Add tests for `copy_files()`
rossellhayes Jun 15, 2021
dee7aa0
Refactor `is_system_file()` as a recursive function
rossellhayes Jun 15, 2021
11a0a1e
Multiple calls to use_remote_files() now merge instead of overwriting
rossellhayes Jun 15, 2021
fd6df39
Copy entire data directory during `evaluate_exercise()`
rossellhayes Jun 16, 2021
9729a91
Remove infrastructure around `use_remote_files()`
rossellhayes Jun 16, 2021
26b61e1
Add `use_data_dir()` function for specifiying a different place to fi…
rossellhayes Jun 16, 2021
9266073
Add data dir test documents to sandbox
rossellhayes Jun 16, 2021
5241eba
Only copy the data directory if the data directory exists
rossellhayes Jun 16, 2021
d812349
Test overwriting and restoring files
rossellhayes Jun 16, 2021
8d14c06
Add test without a data directory
rossellhayes Jun 16, 2021
5fe2118
Remove `cli` formatting
rossellhayes Jun 16, 2021
28a7455
Update documentation of `use_data_dir()`
rossellhayes Jun 16, 2021
4e2e336
Add test with here()
rossellhayes Jun 17, 2021
9037bfa
Prioritize environment variable over `use_data_dir()`
rossellhayes Jun 20, 2021
9f30645
Add tests for data files
rossellhayes Jun 20, 2021
95e547e
Merged upstream/master into rossellhayes-data-files
gadenbuie Jun 21, 2021
7f641b4
Remove commented-out code
rossellhayes Jun 21, 2021
a653af5
Give friendlier error if data dir is not set up successfully in the t…
rossellhayes Jun 21, 2021
5b4a0ee
Raise error if data directory is set by envvar or `options()` and can…
rossellhayes Jun 21, 2021
e3eb7b6
Use "tutorial" instead of "learnr" as prefix in envvar and `options()`
rossellhayes Jun 21, 2021
6dad0f9
Merge branch 'data-files' of https://github.com/rossellhayes/learnr i…
rossellhayes Jun 21, 2021
4b84ff9
Fix option name in `use_data_dir()`
rossellhayes Jun 21, 2021
4ef3078
Split and label data dir tests
rossellhayes Jun 21, 2021
6672a55
Default data directory to "" and only set to "data/" if data director…
rossellhayes Jun 21, 2021
a896a39
Add tests for missing data directory
rossellhayes Jun 21, 2021
19c792e
Change data directory precedence to `options()` > env var > "data/"
rossellhayes Jun 21, 2021
3dc1352
Pass `source_dir` from `evaluate_exercise()` to `copy_data_dir()`
rossellhayes Jun 21, 2021
ba6acca
Update tests to reflect change in data dir precedence
rossellhayes Jun 21, 2021
11657fc
Remove `use_data_dir()`; data directory must now be specified with en…
rossellhayes Jun 22, 2021
5f63026
Remove braces in one-line if-else
rossellhayes Jun 23, 2021
7674d68
Update error message
rossellhayes Jun 23, 2021
be64636
Update error class
rossellhayes Jun 23, 2021
aceb3a2
Update error message
rossellhayes Jun 23, 2021
78b5864
Update error class
rossellhayes Jun 23, 2021
8324144
Reenable data dir set with `options()`
rossellhayes Jun 24, 2021
9e78a7c
Compact code for determining data dir
rossellhayes Jun 24, 2021
7ddafbd
Replace `with_tempdir()` with `local_dir(local_tempdir())`
rossellhayes Jun 24, 2021
d3ed875
Use `check = TRUE` to simplfiy tests of `evaluate_exercise()`
rossellhayes Jun 24, 2021
89d6840
Only test that files have not been modified in tests focused on file …
rossellhayes Jun 24, 2021
cef6ae7
Update sandbox demo
rossellhayes Jun 25, 2021
e19baa4
Remove sandbox/data_dir/
gadenbuie Jun 30, 2021
b1bd8a4
Minor edits to test labels
gadenbuie Jun 30, 2021
509ddaf
Merge branch 'master' into 'rosselhayes/data-files'
gadenbuie Jun 30, 2021
1d4cf7b
Move option/envvar checking into `copy_data_dir()`
gadenbuie Jun 30, 2021
a836094
Merge
rossellhayes Jul 1, 2021
0eea1fd
Add `protect_options()` function which restores `options()` and envva…
rossellhayes Jul 1, 2021
6b32eeb
Add `local_restore_options()` function which *actually* restores `opt…
rossellhayes Jul 1, 2021
792b28d
Merge branch 'data-files' of https://github.com/rossellhayes/learnr i…
rossellhayes Jul 1, 2021
9847989
Add entry to NEWS
rossellhayes Jul 7, 2021
73483f9
[docs] Increase toc_depth to show level-3 headings in TOC
gadenbuie Jul 8, 2021
168249e
[docs] Move setup chunks to level-3 heading and break into smaller ch…
gadenbuie Jul 8, 2021
84e9849
[docs] Make level-3 headings title case
gadenbuie Jul 8, 2021
ed861e2
[docs] Add "Using Files in Exercises" to Exercise Setup
gadenbuie Jul 8, 2021
337cc2d
[docs] Rebuild site
gadenbuie Jul 8, 2021
fcbf1da
[docs] Summarize setup chunk options with links
gadenbuie Jul 8, 2021
aabfe07
Reword NEWS entry
gadenbuie Jul 8, 2021
70fa098
`options` -> `opts`
rossellhayes Jul 8, 2021
7ea8cce
Add `local_restore_envvars()`
rossellhayes Jul 8, 2021
020557b
Use `local_restore_envvars()`
rossellhayes Jul 8, 2021
8b091e5
Use `local_restore_envvars()`
rossellhayes Jul 8, 2021
c114b08
Add `.local_envir = parent.frame()` as default in `local_restore_envv…
rossellhayes Jul 8, 2021
b00b736
Add wrapper function `local_restore_options_and_envvars()`
rossellhayes Jul 8, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export(tutorial)
export(tutorial_html_dependency)
export(tutorial_options)
export(tutorial_package_dependencies)
export(use_data_dir)
import(curl)
import(rmarkdown)
import(shiny)
Expand Down
3 changes: 3 additions & 0 deletions R/exercise.R
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,9 @@ evaluate_exercise <- function(exercise, envir, evaluate_global_setup = FALSE) {
dir.create(exercise_dir)
on.exit(unlink(exercise_dir), add = TRUE)

# Copy files from data directory into exercise
copy_data_dir(exercise_dir)

checker_feedback <- NULL
# Run the checker pre-evaluation _if_ there is code checking to do
if (length(exercise$code_check)) {
Expand Down
7 changes: 7 additions & 0 deletions R/initialize.R
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ initialize_tutorial <- function() {
singleton = TRUE
)

# # Make files accessible to tutorial
# rmarkdown::shiny_prerendered_chunk(
# 'server-start',
# 'learnr:::prepare_data_files()',
# singleton = TRUE
# )

rossellhayes marked this conversation as resolved.
Show resolved Hide resolved
# Register session stop handler
rmarkdown::shiny_prerendered_chunk(
'server',
Expand Down
44 changes: 44 additions & 0 deletions R/use_data_dir.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#' Make files in a directory accessible to tutorials
#'
#' By default, `learnr` tutorials can access files in a `data/` directory within
#' the same directory as the tutorial's R Markdown file. `use_data_dir()` allows
#' you to expose files in a different directory (e.g. the `data/` directory of a
#' different tutorial) to avoid duplicating files.
#'
#' @param dir A directory
#'
#' @return Invisibly returns the specified directory
#' @export
#' @examples \dontrun{
#' use_data_dir("../other_tutorial/data")
#' }

use_data_dir <- function(dir = "data") {
if (!dir.exists(dir)) {
rlang::warn(paste0('The data directory "', dir, '" could not be found.'))
}

options(learnr.data_dir = dir)

invisible(dir)
}

copy_data_dir <- function(exercise_dir) {
rossellhayes marked this conversation as resolved.
Show resolved Hide resolved
# First check environment variable, then options(), then default to "data/"
rossellhayes marked this conversation as resolved.
Show resolved Hide resolved
source_dir <- Sys.getenv(
"LEARNR_DATA_DIR", unset = getOption("learnr.data_dir", default = "data")
rossellhayes marked this conversation as resolved.
Show resolved Hide resolved
)

if (!dir.exists(source_dir)) {return(invisible(NULL))}
rossellhayes marked this conversation as resolved.
Show resolved Hide resolved

dest_dir <- file.path(exercise_dir, "data")
dir.create(dest_dir)

if (!dir.exists(dest_dir)) {
rlang::abort('The user-facing data directory was not created successfully.')
rossellhayes marked this conversation as resolved.
Show resolved Hide resolved
rossellhayes marked this conversation as resolved.
Show resolved Hide resolved
}

file.copy(dir(source_dir, full.names = TRUE), dest_dir, recursive = TRUE)

return(invisible(dest_dir))
}
25 changes: 25 additions & 0 deletions man/use_data_dir.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions sandbox/data_dir/base_dir_test/base_dir_test.Rmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
title: "Tutorial"
output: learnr::tutorial
runtime: shiny_prerendered
---

```{r setup, include=FALSE}
library(learnr)
knitr::opts_chunk$set(echo = FALSE)
library(readr)

use_data_dir("../file_test/data")
```

### This exercise uses files in a different `data/` directory with `options()`

```{r read_mpg, exercise=TRUE}
read_csv("data/mpg.csv")
```
19 changes: 19 additions & 0 deletions sandbox/data_dir/envvar_test/envvar_test.Rmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
title: "Tutorial"
output: learnr::tutorial
runtime: shiny_prerendered
---

```{r setup, include=FALSE}
library(learnr)
knitr::opts_chunk$set(echo = FALSE)
library(readr)

Sys.setenv(LEARNR_DATA_DIR = "../file_test/data")
```

### This exercise uses files in a different `data/` directory with env vars

```{r read_mpg, exercise=TRUE}
read_csv("data/mpg.csv")
```
235 changes: 235 additions & 0 deletions sandbox/data_dir/file_test/data/mpg.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,235 @@
manufacturer,model,displ,year,cyl,trans,drv,cty,hwy,fl,class
audi,a4,1.8,1999,4,auto(l5),f,18,29,p,compact
audi,a4,1.8,1999,4,manual(m5),f,21,29,p,compact
audi,a4,2,2008,4,manual(m6),f,20,31,p,compact
audi,a4,2,2008,4,auto(av),f,21,30,p,compact
audi,a4,2.8,1999,6,auto(l5),f,16,26,p,compact
audi,a4,2.8,1999,6,manual(m5),f,18,26,p,compact
audi,a4,3.1,2008,6,auto(av),f,18,27,p,compact
audi,a4 quattro,1.8,1999,4,manual(m5),4,18,26,p,compact
audi,a4 quattro,1.8,1999,4,auto(l5),4,16,25,p,compact
audi,a4 quattro,2,2008,4,manual(m6),4,20,28,p,compact
audi,a4 quattro,2,2008,4,auto(s6),4,19,27,p,compact
audi,a4 quattro,2.8,1999,6,auto(l5),4,15,25,p,compact
audi,a4 quattro,2.8,1999,6,manual(m5),4,17,25,p,compact
audi,a4 quattro,3.1,2008,6,auto(s6),4,17,25,p,compact
audi,a4 quattro,3.1,2008,6,manual(m6),4,15,25,p,compact
audi,a6 quattro,2.8,1999,6,auto(l5),4,15,24,p,midsize
audi,a6 quattro,3.1,2008,6,auto(s6),4,17,25,p,midsize
audi,a6 quattro,4.2,2008,8,auto(s6),4,16,23,p,midsize
chevrolet,c1500 suburban 2wd,5.3,2008,8,auto(l4),r,14,20,r,suv
chevrolet,c1500 suburban 2wd,5.3,2008,8,auto(l4),r,11,15,e,suv
chevrolet,c1500 suburban 2wd,5.3,2008,8,auto(l4),r,14,20,r,suv
chevrolet,c1500 suburban 2wd,5.7,1999,8,auto(l4),r,13,17,r,suv
chevrolet,c1500 suburban 2wd,6,2008,8,auto(l4),r,12,17,r,suv
chevrolet,corvette,5.7,1999,8,manual(m6),r,16,26,p,2seater
chevrolet,corvette,5.7,1999,8,auto(l4),r,15,23,p,2seater
chevrolet,corvette,6.2,2008,8,manual(m6),r,16,26,p,2seater
chevrolet,corvette,6.2,2008,8,auto(s6),r,15,25,p,2seater
chevrolet,corvette,7,2008,8,manual(m6),r,15,24,p,2seater
chevrolet,k1500 tahoe 4wd,5.3,2008,8,auto(l4),4,14,19,r,suv
chevrolet,k1500 tahoe 4wd,5.3,2008,8,auto(l4),4,11,14,e,suv
chevrolet,k1500 tahoe 4wd,5.7,1999,8,auto(l4),4,11,15,r,suv
chevrolet,k1500 tahoe 4wd,6.5,1999,8,auto(l4),4,14,17,d,suv
chevrolet,malibu,2.4,1999,4,auto(l4),f,19,27,r,midsize
chevrolet,malibu,2.4,2008,4,auto(l4),f,22,30,r,midsize
chevrolet,malibu,3.1,1999,6,auto(l4),f,18,26,r,midsize
chevrolet,malibu,3.5,2008,6,auto(l4),f,18,29,r,midsize
chevrolet,malibu,3.6,2008,6,auto(s6),f,17,26,r,midsize
dodge,caravan 2wd,2.4,1999,4,auto(l3),f,18,24,r,minivan
dodge,caravan 2wd,3,1999,6,auto(l4),f,17,24,r,minivan
dodge,caravan 2wd,3.3,1999,6,auto(l4),f,16,22,r,minivan
dodge,caravan 2wd,3.3,1999,6,auto(l4),f,16,22,r,minivan
dodge,caravan 2wd,3.3,2008,6,auto(l4),f,17,24,r,minivan
dodge,caravan 2wd,3.3,2008,6,auto(l4),f,17,24,r,minivan
dodge,caravan 2wd,3.3,2008,6,auto(l4),f,11,17,e,minivan
dodge,caravan 2wd,3.8,1999,6,auto(l4),f,15,22,r,minivan
dodge,caravan 2wd,3.8,1999,6,auto(l4),f,15,21,r,minivan
dodge,caravan 2wd,3.8,2008,6,auto(l6),f,16,23,r,minivan
dodge,caravan 2wd,4,2008,6,auto(l6),f,16,23,r,minivan
dodge,dakota pickup 4wd,3.7,2008,6,manual(m6),4,15,19,r,pickup
dodge,dakota pickup 4wd,3.7,2008,6,auto(l4),4,14,18,r,pickup
dodge,dakota pickup 4wd,3.9,1999,6,auto(l4),4,13,17,r,pickup
dodge,dakota pickup 4wd,3.9,1999,6,manual(m5),4,14,17,r,pickup
dodge,dakota pickup 4wd,4.7,2008,8,auto(l5),4,14,19,r,pickup
dodge,dakota pickup 4wd,4.7,2008,8,auto(l5),4,14,19,r,pickup
dodge,dakota pickup 4wd,4.7,2008,8,auto(l5),4,9,12,e,pickup
dodge,dakota pickup 4wd,5.2,1999,8,manual(m5),4,11,17,r,pickup
dodge,dakota pickup 4wd,5.2,1999,8,auto(l4),4,11,15,r,pickup
dodge,durango 4wd,3.9,1999,6,auto(l4),4,13,17,r,suv
dodge,durango 4wd,4.7,2008,8,auto(l5),4,13,17,r,suv
dodge,durango 4wd,4.7,2008,8,auto(l5),4,9,12,e,suv
dodge,durango 4wd,4.7,2008,8,auto(l5),4,13,17,r,suv
dodge,durango 4wd,5.2,1999,8,auto(l4),4,11,16,r,suv
dodge,durango 4wd,5.7,2008,8,auto(l5),4,13,18,r,suv
dodge,durango 4wd,5.9,1999,8,auto(l4),4,11,15,r,suv
dodge,ram 1500 pickup 4wd,4.7,2008,8,manual(m6),4,12,16,r,pickup
dodge,ram 1500 pickup 4wd,4.7,2008,8,auto(l5),4,9,12,e,pickup
dodge,ram 1500 pickup 4wd,4.7,2008,8,auto(l5),4,13,17,r,pickup
dodge,ram 1500 pickup 4wd,4.7,2008,8,auto(l5),4,13,17,r,pickup
dodge,ram 1500 pickup 4wd,4.7,2008,8,manual(m6),4,12,16,r,pickup
dodge,ram 1500 pickup 4wd,4.7,2008,8,manual(m6),4,9,12,e,pickup
dodge,ram 1500 pickup 4wd,5.2,1999,8,auto(l4),4,11,15,r,pickup
dodge,ram 1500 pickup 4wd,5.2,1999,8,manual(m5),4,11,16,r,pickup
dodge,ram 1500 pickup 4wd,5.7,2008,8,auto(l5),4,13,17,r,pickup
dodge,ram 1500 pickup 4wd,5.9,1999,8,auto(l4),4,11,15,r,pickup
ford,expedition 2wd,4.6,1999,8,auto(l4),r,11,17,r,suv
ford,expedition 2wd,5.4,1999,8,auto(l4),r,11,17,r,suv
ford,expedition 2wd,5.4,2008,8,auto(l6),r,12,18,r,suv
ford,explorer 4wd,4,1999,6,auto(l5),4,14,17,r,suv
ford,explorer 4wd,4,1999,6,manual(m5),4,15,19,r,suv
ford,explorer 4wd,4,1999,6,auto(l5),4,14,17,r,suv
ford,explorer 4wd,4,2008,6,auto(l5),4,13,19,r,suv
ford,explorer 4wd,4.6,2008,8,auto(l6),4,13,19,r,suv
ford,explorer 4wd,5,1999,8,auto(l4),4,13,17,r,suv
ford,f150 pickup 4wd,4.2,1999,6,auto(l4),4,14,17,r,pickup
ford,f150 pickup 4wd,4.2,1999,6,manual(m5),4,14,17,r,pickup
ford,f150 pickup 4wd,4.6,1999,8,manual(m5),4,13,16,r,pickup
ford,f150 pickup 4wd,4.6,1999,8,auto(l4),4,13,16,r,pickup
ford,f150 pickup 4wd,4.6,2008,8,auto(l4),4,13,17,r,pickup
ford,f150 pickup 4wd,5.4,1999,8,auto(l4),4,11,15,r,pickup
ford,f150 pickup 4wd,5.4,2008,8,auto(l4),4,13,17,r,pickup
ford,mustang,3.8,1999,6,manual(m5),r,18,26,r,subcompact
ford,mustang,3.8,1999,6,auto(l4),r,18,25,r,subcompact
ford,mustang,4,2008,6,manual(m5),r,17,26,r,subcompact
ford,mustang,4,2008,6,auto(l5),r,16,24,r,subcompact
ford,mustang,4.6,1999,8,auto(l4),r,15,21,r,subcompact
ford,mustang,4.6,1999,8,manual(m5),r,15,22,r,subcompact
ford,mustang,4.6,2008,8,manual(m5),r,15,23,r,subcompact
ford,mustang,4.6,2008,8,auto(l5),r,15,22,r,subcompact
ford,mustang,5.4,2008,8,manual(m6),r,14,20,p,subcompact
honda,civic,1.6,1999,4,manual(m5),f,28,33,r,subcompact
honda,civic,1.6,1999,4,auto(l4),f,24,32,r,subcompact
honda,civic,1.6,1999,4,manual(m5),f,25,32,r,subcompact
honda,civic,1.6,1999,4,manual(m5),f,23,29,p,subcompact
honda,civic,1.6,1999,4,auto(l4),f,24,32,r,subcompact
honda,civic,1.8,2008,4,manual(m5),f,26,34,r,subcompact
honda,civic,1.8,2008,4,auto(l5),f,25,36,r,subcompact
honda,civic,1.8,2008,4,auto(l5),f,24,36,c,subcompact
honda,civic,2,2008,4,manual(m6),f,21,29,p,subcompact
hyundai,sonata,2.4,1999,4,auto(l4),f,18,26,r,midsize
hyundai,sonata,2.4,1999,4,manual(m5),f,18,27,r,midsize
hyundai,sonata,2.4,2008,4,auto(l4),f,21,30,r,midsize
hyundai,sonata,2.4,2008,4,manual(m5),f,21,31,r,midsize
hyundai,sonata,2.5,1999,6,auto(l4),f,18,26,r,midsize
hyundai,sonata,2.5,1999,6,manual(m5),f,18,26,r,midsize
hyundai,sonata,3.3,2008,6,auto(l5),f,19,28,r,midsize
hyundai,tiburon,2,1999,4,auto(l4),f,19,26,r,subcompact
hyundai,tiburon,2,1999,4,manual(m5),f,19,29,r,subcompact
hyundai,tiburon,2,2008,4,manual(m5),f,20,28,r,subcompact
hyundai,tiburon,2,2008,4,auto(l4),f,20,27,r,subcompact
hyundai,tiburon,2.7,2008,6,auto(l4),f,17,24,r,subcompact
hyundai,tiburon,2.7,2008,6,manual(m6),f,16,24,r,subcompact
hyundai,tiburon,2.7,2008,6,manual(m5),f,17,24,r,subcompact
jeep,grand cherokee 4wd,3,2008,6,auto(l5),4,17,22,d,suv
jeep,grand cherokee 4wd,3.7,2008,6,auto(l5),4,15,19,r,suv
jeep,grand cherokee 4wd,4,1999,6,auto(l4),4,15,20,r,suv
jeep,grand cherokee 4wd,4.7,1999,8,auto(l4),4,14,17,r,suv
jeep,grand cherokee 4wd,4.7,2008,8,auto(l5),4,9,12,e,suv
jeep,grand cherokee 4wd,4.7,2008,8,auto(l5),4,14,19,r,suv
jeep,grand cherokee 4wd,5.7,2008,8,auto(l5),4,13,18,r,suv
jeep,grand cherokee 4wd,6.1,2008,8,auto(l5),4,11,14,p,suv
land rover,range rover,4,1999,8,auto(l4),4,11,15,p,suv
land rover,range rover,4.2,2008,8,auto(s6),4,12,18,r,suv
land rover,range rover,4.4,2008,8,auto(s6),4,12,18,r,suv
land rover,range rover,4.6,1999,8,auto(l4),4,11,15,p,suv
lincoln,navigator 2wd,5.4,1999,8,auto(l4),r,11,17,r,suv
lincoln,navigator 2wd,5.4,1999,8,auto(l4),r,11,16,p,suv
lincoln,navigator 2wd,5.4,2008,8,auto(l6),r,12,18,r,suv
mercury,mountaineer 4wd,4,1999,6,auto(l5),4,14,17,r,suv
mercury,mountaineer 4wd,4,2008,6,auto(l5),4,13,19,r,suv
mercury,mountaineer 4wd,4.6,2008,8,auto(l6),4,13,19,r,suv
mercury,mountaineer 4wd,5,1999,8,auto(l4),4,13,17,r,suv
nissan,altima,2.4,1999,4,manual(m5),f,21,29,r,compact
nissan,altima,2.4,1999,4,auto(l4),f,19,27,r,compact
nissan,altima,2.5,2008,4,auto(av),f,23,31,r,midsize
nissan,altima,2.5,2008,4,manual(m6),f,23,32,r,midsize
nissan,altima,3.5,2008,6,manual(m6),f,19,27,p,midsize
nissan,altima,3.5,2008,6,auto(av),f,19,26,p,midsize
nissan,maxima,3,1999,6,auto(l4),f,18,26,r,midsize
nissan,maxima,3,1999,6,manual(m5),f,19,25,r,midsize
nissan,maxima,3.5,2008,6,auto(av),f,19,25,p,midsize
nissan,pathfinder 4wd,3.3,1999,6,auto(l4),4,14,17,r,suv
nissan,pathfinder 4wd,3.3,1999,6,manual(m5),4,15,17,r,suv
nissan,pathfinder 4wd,4,2008,6,auto(l5),4,14,20,p,suv
nissan,pathfinder 4wd,5.6,2008,8,auto(s5),4,12,18,p,suv
pontiac,grand prix,3.1,1999,6,auto(l4),f,18,26,r,midsize
pontiac,grand prix,3.8,1999,6,auto(l4),f,16,26,p,midsize
pontiac,grand prix,3.8,1999,6,auto(l4),f,17,27,r,midsize
pontiac,grand prix,3.8,2008,6,auto(l4),f,18,28,r,midsize
pontiac,grand prix,5.3,2008,8,auto(s4),f,16,25,p,midsize
subaru,forester awd,2.5,1999,4,manual(m5),4,18,25,r,suv
subaru,forester awd,2.5,1999,4,auto(l4),4,18,24,r,suv
subaru,forester awd,2.5,2008,4,manual(m5),4,20,27,r,suv
subaru,forester awd,2.5,2008,4,manual(m5),4,19,25,p,suv
subaru,forester awd,2.5,2008,4,auto(l4),4,20,26,r,suv
subaru,forester awd,2.5,2008,4,auto(l4),4,18,23,p,suv
subaru,impreza awd,2.2,1999,4,auto(l4),4,21,26,r,subcompact
subaru,impreza awd,2.2,1999,4,manual(m5),4,19,26,r,subcompact
subaru,impreza awd,2.5,1999,4,manual(m5),4,19,26,r,subcompact
subaru,impreza awd,2.5,1999,4,auto(l4),4,19,26,r,subcompact
subaru,impreza awd,2.5,2008,4,auto(s4),4,20,25,p,compact
subaru,impreza awd,2.5,2008,4,auto(s4),4,20,27,r,compact
subaru,impreza awd,2.5,2008,4,manual(m5),4,19,25,p,compact
subaru,impreza awd,2.5,2008,4,manual(m5),4,20,27,r,compact
toyota,4runner 4wd,2.7,1999,4,manual(m5),4,15,20,r,suv
toyota,4runner 4wd,2.7,1999,4,auto(l4),4,16,20,r,suv
toyota,4runner 4wd,3.4,1999,6,auto(l4),4,15,19,r,suv
toyota,4runner 4wd,3.4,1999,6,manual(m5),4,15,17,r,suv
toyota,4runner 4wd,4,2008,6,auto(l5),4,16,20,r,suv
toyota,4runner 4wd,4.7,2008,8,auto(l5),4,14,17,r,suv
toyota,camry,2.2,1999,4,manual(m5),f,21,29,r,midsize
toyota,camry,2.2,1999,4,auto(l4),f,21,27,r,midsize
toyota,camry,2.4,2008,4,manual(m5),f,21,31,r,midsize
toyota,camry,2.4,2008,4,auto(l5),f,21,31,r,midsize
toyota,camry,3,1999,6,auto(l4),f,18,26,r,midsize
toyota,camry,3,1999,6,manual(m5),f,18,26,r,midsize
toyota,camry,3.5,2008,6,auto(s6),f,19,28,r,midsize
toyota,camry solara,2.2,1999,4,auto(l4),f,21,27,r,compact
toyota,camry solara,2.2,1999,4,manual(m5),f,21,29,r,compact
toyota,camry solara,2.4,2008,4,manual(m5),f,21,31,r,compact
toyota,camry solara,2.4,2008,4,auto(s5),f,22,31,r,compact
toyota,camry solara,3,1999,6,auto(l4),f,18,26,r,compact
toyota,camry solara,3,1999,6,manual(m5),f,18,26,r,compact
toyota,camry solara,3.3,2008,6,auto(s5),f,18,27,r,compact
toyota,corolla,1.8,1999,4,auto(l3),f,24,30,r,compact
toyota,corolla,1.8,1999,4,auto(l4),f,24,33,r,compact
toyota,corolla,1.8,1999,4,manual(m5),f,26,35,r,compact
toyota,corolla,1.8,2008,4,manual(m5),f,28,37,r,compact
toyota,corolla,1.8,2008,4,auto(l4),f,26,35,r,compact
toyota,land cruiser wagon 4wd,4.7,1999,8,auto(l4),4,11,15,r,suv
toyota,land cruiser wagon 4wd,5.7,2008,8,auto(s6),4,13,18,r,suv
toyota,toyota tacoma 4wd,2.7,1999,4,manual(m5),4,15,20,r,pickup
toyota,toyota tacoma 4wd,2.7,1999,4,auto(l4),4,16,20,r,pickup
toyota,toyota tacoma 4wd,2.7,2008,4,manual(m5),4,17,22,r,pickup
toyota,toyota tacoma 4wd,3.4,1999,6,manual(m5),4,15,17,r,pickup
toyota,toyota tacoma 4wd,3.4,1999,6,auto(l4),4,15,19,r,pickup
toyota,toyota tacoma 4wd,4,2008,6,manual(m6),4,15,18,r,pickup
toyota,toyota tacoma 4wd,4,2008,6,auto(l5),4,16,20,r,pickup
volkswagen,gti,2,1999,4,manual(m5),f,21,29,r,compact
volkswagen,gti,2,1999,4,auto(l4),f,19,26,r,compact
volkswagen,gti,2,2008,4,manual(m6),f,21,29,p,compact
volkswagen,gti,2,2008,4,auto(s6),f,22,29,p,compact
volkswagen,gti,2.8,1999,6,manual(m5),f,17,24,r,compact
volkswagen,jetta,1.9,1999,4,manual(m5),f,33,44,d,compact
volkswagen,jetta,2,1999,4,manual(m5),f,21,29,r,compact
volkswagen,jetta,2,1999,4,auto(l4),f,19,26,r,compact
volkswagen,jetta,2,2008,4,auto(s6),f,22,29,p,compact
volkswagen,jetta,2,2008,4,manual(m6),f,21,29,p,compact
volkswagen,jetta,2.5,2008,5,auto(s6),f,21,29,r,compact
volkswagen,jetta,2.5,2008,5,manual(m5),f,21,29,r,compact
volkswagen,jetta,2.8,1999,6,auto(l4),f,16,23,r,compact
volkswagen,jetta,2.8,1999,6,manual(m5),f,17,24,r,compact
volkswagen,new beetle,1.9,1999,4,manual(m5),f,35,44,d,subcompact
volkswagen,new beetle,1.9,1999,4,auto(l4),f,29,41,d,subcompact
volkswagen,new beetle,2,1999,4,manual(m5),f,21,29,r,subcompact
volkswagen,new beetle,2,1999,4,auto(l4),f,19,26,r,subcompact
volkswagen,new beetle,2.5,2008,5,manual(m5),f,20,28,r,subcompact
volkswagen,new beetle,2.5,2008,5,auto(s6),f,20,29,r,subcompact
volkswagen,passat,1.8,1999,4,manual(m5),f,21,29,p,midsize
volkswagen,passat,1.8,1999,4,auto(l5),f,18,29,p,midsize
volkswagen,passat,2,2008,4,auto(s6),f,19,28,p,midsize
volkswagen,passat,2,2008,4,manual(m6),f,21,29,p,midsize
volkswagen,passat,2.8,1999,6,auto(l5),f,16,26,p,midsize
volkswagen,passat,2.8,1999,6,manual(m5),f,18,26,p,midsize
volkswagen,passat,3.6,2008,6,auto(s6),f,17,26,p,midsize
Loading