on.exit calls code when a function exits, but how and when should I use it?
Related Questions in R
- How to make an R Shiny app with big data?
- How do I keep only specific rows based on whether a column has a specific value?
- Likert scale study - ordinal regression model
- Extract a table/matrix from R into Excel with same colors and stle
- How can I solve non-conformable arguments in R netmeta::discomb (Error in B.matrix %*% C.matrix)?
- Can raw means and estimated marginal means be the same ? And when?
- Understanding accumulate function when .dir is set to "backwards"
- Error in if (nrow(peaks) > 0) { : argument is of length zero Calls: CopywriteR ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous> Execution ha
- How to increase quality of mathjax output?
- Convert the time intervals to equal hours and fill in the value column
- How to run an R function getpoints() from IPDfromKM package in an R shiny app which in R pops up a plot that utilizes clicks to capture coordinates?
- Replace NA in list of dfs in certain columns and under certain conditions
- R and text on Cyrillic
- The ts() function in R is returning the correct start and frequency but not end value which is 1 and not 179
- TROUBLING with the "DROP_NA" Function
Related Questions in R-FAQ
- What does |> (pipe greater than) mean in R?
- What are the differences between R's native pipe `|>` and the magrittr pipe `%>%`?
- How should I deal with "'someFunction' is not an exported object from 'namespace:somePackage'" error?
- How to order data by value within ggplot facets
- Create a group index for values connected directly and indirectly
- How to debug "contrasts can be applied only to factors with 2 or more levels" error?
- `lm` summary not display all factor levels
- What are primitive, internal, builtin, and special functions?
- What does "The following object is masked from 'package:xxx'" mean?
- dplyr left_join by less than, greater than condition
- R: How to split a data frame into training, validation, and test sets?
- How do I get a list of built-in data sets in R?
- Issue when passing variable with dollar sign notation ($) to aes() in combination with facet_grid() or facet_wrap()
- Read SAS sas7bdat data into R
- Get filename without extension in R
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
The advantage of
on.exitis that is gets called when the function exits, regardless of whether an error was thrown. This means that its main use is for cleaning up after risky behaviour. Risky, in this context, usually means accessing resources outside of R (that consequently cannot be guaranteed to work). Common examples include connecting to databases or file (where the connection must be closed when you are finished, even if there was an error), or saving a plot to a file (where the graphics device must be closed afterwards).You can also use
on.exitfor low-risk behaviour with a side effect, such as setting a working directory.In general, you should set
add = TRUEinon.exit(). See https://adv-r.hadley.nz/functions.html?q=on.exit#on-exit.Packages that make use of
on.exitThe
withrpackage contains manywith_*functions that change a setting, run some code, then change the setting back. These functions also appear in thedevtoolspackage.An alternate syntax is found in the
laterpackage wheredeferis a convenience wrapper toon.exit, andscope_*functions work like thewith_*functions in the previously mentioned packages.Database connections
In this example,
sqlite_get_queryconnects to an sqlite database, ensuring that the connection always gets closed after the query has run. Thecookiesdatabase requires that you have firefox installed on your machine, and you may need to adjust the path to find the cookies file.File connections
In this example,
read_charswrapsreadChars, ensuring that the connection to the file is always closed after reading is finished.Temporary files
The following example adapted from CodeDepends uses a temporary file to save the session history. This temporary file is not needed once the function returns so it is removed.
Saving base graphics
In this example,
my_plotis a function that creates a plot using base graphics.save_base_plotaccepts a function and a file to save it to, usingon.exitto ensure that the graphics device is always closed.Setting base graphics options temporarily
In this example,
plot_with_big_marginscallsplot, overriding the globalmarginparameter, usingon.exitto reset it after the plot is completed.withr/devtoolsequivalent:with_parSetting global options temporarily
In this example,
create_data_frameis a function that creates adata.frame.create_data_frameensures that the created object doesn't contain explicit factors.withr/devtoolsequivalent:with_optionslaterequivalent:scope_optionsOther examples
withr::with_dir,later::scope_dir)withr::with_locale)withr::with_envvars,later::scope_env_var)withr::with_libpaths)withr::with_package,withr::with_namespace)