Repository files navigation

workflows A teal-colored hexagonal logo. The word WORKFLOWS is centered inside of a diagram of circular cycle, with a magrittr pipe on the top and a directed graph on the bottom.

Codecov test coverageR-CMD-check

What is a workflow?

A workflow is an object that can bundle together your pre-processing, modeling, and post-processing requests. For example, if you have a recipe and parsnip model, these can be combined into a workflow. The advantages are:

  • You don’t have to keep track of separate objects in your workspace.

  • The recipe prepping, model fitting, and postprocessor estimation (which may include data splitting) can be executed using a single call to fit().

  • If you have custom tuning parameter settings, these can be defined using a simpler interface when combined with tune.

Installation

You can install workflows from CRAN with:

install.packages("workflows")

You can install the development version from GitHub with:

# install.packages("pak")pak::pak("tidymodels/workflows")

Example

Suppose you were modeling data on cars. Say… the fuel efficiency of 32 cars. You know that the relationship between engine displacement and miles-per-gallon is nonlinear, and you would like to model that as a spline before adding it to a Bayesian linear regression model. You might have a recipe to specify the spline:

library(recipes)
library(parsnip)
library(workflows)
spline_cars<- recipe(mpg~., data=mtcars) |>
step_ns(disp, deg_free=10)

and a model object:

bayes_lm<- linear_reg() |>
set_engine("stan")

To use these, you would generally run:

spline_cars_prepped<- prep(spline_cars, mtcars)
bayes_lm_fit<- fit(
bayes_lm,
mpg~.,
data= bake(spline_cars_prepped, new_data=NULL)
)

You can’t predict on new samples using bayes_lm_fit without the prepped version of spline_cars around. You also might have other models and recipes in your workspace. This might lead to getting them mixed-up or forgetting to save the model/recipe pair that you are most interested in.

workflows makes this easier by combining these objects together:

car_wflow<- workflow() |>
add_recipe(spline_cars) |>
add_model(bayes_lm)

Now you can prepare the recipe and estimate the model via a single call to fit():

car_wflow_fit<- fit(car_wflow, data=mtcars)

You can alter existing workflows using update_recipe() / update_model() and remove_recipe() / remove_model().

Contributing

This project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

About

Modeling Workflows

Resources

Code of conduct

Contributing

Stars

211 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

workflows A teal-colored hexagonal logo. The word WORKFLOWS is centered inside of a diagram of circular cycle, with a magrittr pipe on the top and a directed graph on the bottom.

Codecov test coverageR-CMD-check

What is a workflow?

A workflow is an object that can bundle together your pre-processing, modeling, and post-processing requests. For example, if you have a recipe and parsnip model, these can be combined into a workflow. The advantages are:

  • You don’t have to keep track of separate objects in your workspace.

  • The recipe prepping, model fitting, and postprocessor estimation (which may include data splitting) can be executed using a single call to fit().

  • If you have custom tuning parameter settings, these can be defined using a simpler interface when combined with tune.

Installation

You can install workflows from CRAN with:

install.packages("workflows")

You can install the development version from GitHub with:

# install.packages("pak")pak::pak("tidymodels/workflows")

Example

Suppose you were modeling data on cars. Say… the fuel efficiency of 32 cars. You know that the relationship between engine displacement and miles-per-gallon is nonlinear, and you would like to model that as a spline before adding it to a Bayesian linear regression model. You might have a recipe to specify the spline:

library(recipes)
library(parsnip)
library(workflows)
spline_cars<- recipe(mpg~., data=mtcars) |>
step_ns(disp, deg_free=10)

and a model object:

bayes_lm<- linear_reg() |>
set_engine("stan")

To use these, you would generally run:

spline_cars_prepped<- prep(spline_cars, mtcars)
bayes_lm_fit<- fit(
bayes_lm,
mpg~.,
data= bake(spline_cars_prepped, new_data=NULL)
)

You can’t predict on new samples using bayes_lm_fit without the prepped version of spline_cars around. You also might have other models and recipes in your workspace. This might lead to getting them mixed-up or forgetting to save the model/recipe pair that you are most interested in.

workflows makes this easier by combining these objects together:

car_wflow<- workflow() |>
add_recipe(spline_cars) |>
add_model(bayes_lm)

Now you can prepare the recipe and estimate the model via a single call to fit():

car_wflow_fit<- fit(car_wflow, data=mtcars)

You can alter existing workflows using update_recipe() / update_model() and remove_recipe() / remove_model().

Contributing

This project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

About

Modeling Workflows

Resources

Code of conduct

Contributing

Stars

211 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

workflows A teal-colored hexagonal logo. The word WORKFLOWS is centered inside of a diagram of circular cycle, with a magrittr pipe on the top and a directed graph on the bottom.

Codecov test coverageR-CMD-check

What is a workflow?

A workflow is an object that can bundle together your pre-processing, modeling, and post-processing requests. For example, if you have a recipe and parsnip model, these can be combined into a workflow. The advantages are:

  • You don’t have to keep track of separate objects in your workspace.

  • The recipe prepping, model fitting, and postprocessor estimation (which may include data splitting) can be executed using a single call to fit().

  • If you have custom tuning parameter settings, these can be defined using a simpler interface when combined with tune.

Installation

You can install workflows from CRAN with:

install.packages("workflows")

You can install the development version from GitHub with:

# install.packages("pak")pak::pak("tidymodels/workflows")

Example

Suppose you were modeling data on cars. Say… the fuel efficiency of 32 cars. You know that the relationship between engine displacement and miles-per-gallon is nonlinear, and you would like to model that as a spline before adding it to a Bayesian linear regression model. You might have a recipe to specify the spline:

library(recipes)
library(parsnip)
library(workflows)
spline_cars<- recipe(mpg~., data=mtcars) |>
step_ns(disp, deg_free=10)

and a model object:

bayes_lm<- linear_reg() |>
set_engine("stan")

To use these, you would generally run:

spline_cars_prepped<- prep(spline_cars, mtcars)
bayes_lm_fit<- fit(
bayes_lm,
mpg~.,
data= bake(spline_cars_prepped, new_data=NULL)
)

You can’t predict on new samples using bayes_lm_fit without the prepped version of spline_cars around. You also might have other models and recipes in your workspace. This might lead to getting them mixed-up or forgetting to save the model/recipe pair that you are most interested in.

workflows makes this easier by combining these objects together:

car_wflow<- workflow() |>
add_recipe(spline_cars) |>
add_model(bayes_lm)

Now you can prepare the recipe and estimate the model via a single call to fit():

car_wflow_fit<- fit(car_wflow, data=mtcars)

You can alter existing workflows using update_recipe() / update_model() and remove_recipe() / remove_model().

Contributing

This project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

About

Modeling Workflows

Resources

Code of conduct

Contributing

Stars

211 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

workflows A teal-colored hexagonal logo. The word WORKFLOWS is centered inside of a diagram of circular cycle, with a magrittr pipe on the top and a directed graph on the bottom.

Codecov test coverageR-CMD-check

What is a workflow?

A workflow is an object that can bundle together your pre-processing, modeling, and post-processing requests. For example, if you have a recipe and parsnip model, these can be combined into a workflow. The advantages are:

  • You don’t have to keep track of separate objects in your workspace.

  • The recipe prepping, model fitting, and postprocessor estimation (which may include data splitting) can be executed using a single call to fit().

  • If you have custom tuning parameter settings, these can be defined using a simpler interface when combined with tune.

Installation

You can install workflows from CRAN with:

install.packages("workflows")

You can install the development version from GitHub with:

# install.packages("pak")pak::pak("tidymodels/workflows")

Example

Suppose you were modeling data on cars. Say… the fuel efficiency of 32 cars. You know that the relationship between engine displacement and miles-per-gallon is nonlinear, and you would like to model that as a spline before adding it to a Bayesian linear regression model. You might have a recipe to specify the spline:

library(recipes)
library(parsnip)
library(workflows)
spline_cars<- recipe(mpg~., data=mtcars) |>
step_ns(disp, deg_free=10)

and a model object:

bayes_lm<- linear_reg() |>
set_engine("stan")

To use these, you would generally run:

spline_cars_prepped<- prep(spline_cars, mtcars)
bayes_lm_fit<- fit(
bayes_lm,
mpg~.,
data= bake(spline_cars_prepped, new_data=NULL)
)

You can’t predict on new samples using bayes_lm_fit without the prepped version of spline_cars around. You also might have other models and recipes in your workspace. This might lead to getting them mixed-up or forgetting to save the model/recipe pair that you are most interested in.

workflows makes this easier by combining these objects together:

car_wflow<- workflow() |>
add_recipe(spline_cars) |>
add_model(bayes_lm)

Now you can prepare the recipe and estimate the model via a single call to fit():

car_wflow_fit<- fit(car_wflow, data=mtcars)

You can alter existing workflows using update_recipe() / update_model() and remove_recipe() / remove_model().

Contributing

This project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

About

Modeling Workflows

Resources

Code of conduct

Contributing

Stars

211 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

workflows A teal-colored hexagonal logo. The word WORKFLOWS is centered inside of a diagram of circular cycle, with a magrittr pipe on the top and a directed graph on the bottom.

Codecov test coverageR-CMD-check

What is a workflow?

A workflow is an object that can bundle together your pre-processing, modeling, and post-processing requests. For example, if you have a recipe and parsnip model, these can be combined into a workflow. The advantages are:

  • You don’t have to keep track of separate objects in your workspace.

  • The recipe prepping, model fitting, and postprocessor estimation (which may include data splitting) can be executed using a single call to fit().

  • If you have custom tuning parameter settings, these can be defined using a simpler interface when combined with tune.

Installation

You can install workflows from CRAN with:

install.packages("workflows")

You can install the development version from GitHub with:

# install.packages("pak")pak::pak("tidymodels/workflows")

Example

Suppose you were modeling data on cars. Say… the fuel efficiency of 32 cars. You know that the relationship between engine displacement and miles-per-gallon is nonlinear, and you would like to model that as a spline before adding it to a Bayesian linear regression model. You might have a recipe to specify the spline:

library(recipes)
library(parsnip)
library(workflows)
spline_cars<- recipe(mpg~., data=mtcars) |>
step_ns(disp, deg_free=10)

and a model object:

bayes_lm<- linear_reg() |>
set_engine("stan")

To use these, you would generally run:

spline_cars_prepped<- prep(spline_cars, mtcars)
bayes_lm_fit<- fit(
bayes_lm,
mpg~.,
data= bake(spline_cars_prepped, new_data=NULL)
)

You can’t predict on new samples using bayes_lm_fit without the prepped version of spline_cars around. You also might have other models and recipes in your workspace. This might lead to getting them mixed-up or forgetting to save the model/recipe pair that you are most interested in.

workflows makes this easier by combining these objects together:

car_wflow<- workflow() |>
add_recipe(spline_cars) |>
add_model(bayes_lm)

Now you can prepare the recipe and estimate the model via a single call to fit():

car_wflow_fit<- fit(car_wflow, data=mtcars)

You can alter existing workflows using update_recipe() / update_model() and remove_recipe() / remove_model().

Contributing

This project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

About

Modeling Workflows

Resources

Code of conduct

Contributing

Stars

211 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

workflows A teal-colored hexagonal logo. The word WORKFLOWS is centered inside of a diagram of circular cycle, with a magrittr pipe on the top and a directed graph on the bottom.

Codecov test coverageR-CMD-check

What is a workflow?

A workflow is an object that can bundle together your pre-processing, modeling, and post-processing requests. For example, if you have a recipe and parsnip model, these can be combined into a workflow. The advantages are:

  • You don’t have to keep track of separate objects in your workspace.

  • The recipe prepping, model fitting, and postprocessor estimation (which may include data splitting) can be executed using a single call to fit().

  • If you have custom tuning parameter settings, these can be defined using a simpler interface when combined with tune.

Installation

You can install workflows from CRAN with:

install.packages("workflows")

You can install the development version from GitHub with:

# install.packages("pak")pak::pak("tidymodels/workflows")

Example

Suppose you were modeling data on cars. Say… the fuel efficiency of 32 cars. You know that the relationship between engine displacement and miles-per-gallon is nonlinear, and you would like to model that as a spline before adding it to a Bayesian linear regression model. You might have a recipe to specify the spline:

library(recipes)
library(parsnip)
library(workflows)
spline_cars<- recipe(mpg~., data=mtcars) |>
step_ns(disp, deg_free=10)

and a model object:

bayes_lm<- linear_reg() |>
set_engine("stan")

To use these, you would generally run:

spline_cars_prepped<- prep(spline_cars, mtcars)
bayes_lm_fit<- fit(
bayes_lm,
mpg~.,
data= bake(spline_cars_prepped, new_data=NULL)
)

You can’t predict on new samples using bayes_lm_fit without the prepped version of spline_cars around. You also might have other models and recipes in your workspace. This might lead to getting them mixed-up or forgetting to save the model/recipe pair that you are most interested in.

workflows makes this easier by combining these objects together:

car_wflow<- workflow() |>
add_recipe(spline_cars) |>
add_model(bayes_lm)

Now you can prepare the recipe and estimate the model via a single call to fit():

car_wflow_fit<- fit(car_wflow, data=mtcars)

You can alter existing workflows using update_recipe() / update_model() and remove_recipe() / remove_model().

Contributing

This project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

About

Modeling Workflows

Resources

Code of conduct

Contributing

Stars

211 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

workflows A teal-colored hexagonal logo. The word WORKFLOWS is centered inside of a diagram of circular cycle, with a magrittr pipe on the top and a directed graph on the bottom.

Codecov test coverageR-CMD-check

What is a workflow?

A workflow is an object that can bundle together your pre-processing, modeling, and post-processing requests. For example, if you have a recipe and parsnip model, these can be combined into a workflow. The advantages are:

  • You don’t have to keep track of separate objects in your workspace.

  • The recipe prepping, model fitting, and postprocessor estimation (which may include data splitting) can be executed using a single call to fit().

  • If you have custom tuning parameter settings, these can be defined using a simpler interface when combined with tune.

Installation

You can install workflows from CRAN with:

install.packages("workflows")

You can install the development version from GitHub with:

# install.packages("pak")pak::pak("tidymodels/workflows")

Example

Suppose you were modeling data on cars. Say… the fuel efficiency of 32 cars. You know that the relationship between engine displacement and miles-per-gallon is nonlinear, and you would like to model that as a spline before adding it to a Bayesian linear regression model. You might have a recipe to specify the spline:

library(recipes)
library(parsnip)
library(workflows)
spline_cars<- recipe(mpg~., data=mtcars) |>
step_ns(disp, deg_free=10)

and a model object:

bayes_lm<- linear_reg() |>
set_engine("stan")

To use these, you would generally run:

spline_cars_prepped<- prep(spline_cars, mtcars)
bayes_lm_fit<- fit(
bayes_lm,
mpg~.,
data= bake(spline_cars_prepped, new_data=NULL)
)

You can’t predict on new samples using bayes_lm_fit without the prepped version of spline_cars around. You also might have other models and recipes in your workspace. This might lead to getting them mixed-up or forgetting to save the model/recipe pair that you are most interested in.

workflows makes this easier by combining these objects together:

car_wflow<- workflow() |>
add_recipe(spline_cars) |>
add_model(bayes_lm)

Now you can prepare the recipe and estimate the model via a single call to fit():

car_wflow_fit<- fit(car_wflow, data=mtcars)

You can alter existing workflows using update_recipe() / update_model() and remove_recipe() / remove_model().

Contributing

This project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

About

Modeling Workflows

Resources

Code of conduct

Contributing

Stars

211 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

workflows A teal-colored hexagonal logo. The word WORKFLOWS is centered inside of a diagram of circular cycle, with a magrittr pipe on the top and a directed graph on the bottom.

Codecov test coverageR-CMD-check

What is a workflow?

A workflow is an object that can bundle together your pre-processing, modeling, and post-processing requests. For example, if you have a recipe and parsnip model, these can be combined into a workflow. The advantages are:

  • You don’t have to keep track of separate objects in your workspace.

  • The recipe prepping, model fitting, and postprocessor estimation (which may include data splitting) can be executed using a single call to fit().

  • If you have custom tuning parameter settings, these can be defined using a simpler interface when combined with tune.

Installation

You can install workflows from CRAN with:

install.packages("workflows")

You can install the development version from GitHub with:

# install.packages("pak")pak::pak("tidymodels/workflows")

Example

Suppose you were modeling data on cars. Say… the fuel efficiency of 32 cars. You know that the relationship between engine displacement and miles-per-gallon is nonlinear, and you would like to model that as a spline before adding it to a Bayesian linear regression model. You might have a recipe to specify the spline:

library(recipes)
library(parsnip)
library(workflows)
spline_cars<- recipe(mpg~., data=mtcars) |>
step_ns(disp, deg_free=10)

and a model object:

bayes_lm<- linear_reg() |>
set_engine("stan")

To use these, you would generally run:

spline_cars_prepped<- prep(spline_cars, mtcars)
bayes_lm_fit<- fit(
bayes_lm,
mpg~.,
data= bake(spline_cars_prepped, new_data=NULL)
)

You can’t predict on new samples using bayes_lm_fit without the prepped version of spline_cars around. You also might have other models and recipes in your workspace. This might lead to getting them mixed-up or forgetting to save the model/recipe pair that you are most interested in.

workflows makes this easier by combining these objects together:

car_wflow<- workflow() |>
add_recipe(spline_cars) |>
add_model(bayes_lm)

Now you can prepare the recipe and estimate the model via a single call to fit():

car_wflow_fit<- fit(car_wflow, data=mtcars)

You can alter existing workflows using update_recipe() / update_model() and remove_recipe() / remove_model().

Contributing

This project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

About

Modeling Workflows

Resources

Code of conduct

Contributing

Stars

211 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages