rfunction# Replace multiple Instances of a variable name in an R function and save the modified function

**Context**

Consider the following silly MWE:

```
old_fun <- function(x) {
VarA <- sum(x)
VarA <- 2 * VarA
VarX <- VarA %% 2
return(list("VarA" = VarA, "VarX" = VarX))
}
```

I want to replace `VarA`

with `VarB`

and `VarX`

`VarY`

to get:

```
new_fun <- function(x) {
VarB <- sum(x)
VarB <- 2 * VarB
VarY <- VarB %% 2
return(list("VarB" = VarB, "VarY" = VarY))
}
```

Then I want to save `new_fun`

so I can use it.

**My Approach**

I was thinking something like

```
# Variables to replace
variables_to_replace <- c("VarA", "VarX")
new_variables <- c("VarB", "VarY")
# Replace variables in the function code
modified_code <- deparse(substitute(old_fun))
for (i in seq_along(variables_to_replace)) {
modified_code <- gsub(variables_to_replace[i], new_variables[i], modified_code)
}
# Create a new function with replaced variables
new_fun <- eval(parse(text = modified_code))
```

However, `new_fun`

is `NULL`

and I'm unsure how best to go about saving it to a folder.

Solution

Use `substitute`

on the body:

```
new_fun <- old_fun
body(new_fun) <- do.call("substitute",
list(body(old_fun), list(VarA = as.name("VarB"), VarX = as.name("VarY"))))
dump("new_fun", "new_fun.R") # write it out
new_fun
## function (x)
## {
## VarB <- sum(x)
## VarB <- 2 * VarB
## VarY <- VarB%%2
## }
```

- Making an SEIR model parameter to depend on incidence of a compartment at each time step using ode function
- Applying strsplit() on data.frame results in unexpected output
- How to use pivot_longer to combine multiple columns in R with dplyr
- How to access and read files on an external hard drive using R and RStudio (Mac)?
- Subsetting netcdf files with multiple variables by time range
- Using enter key with action button in R Shiny
- How do I change the default library path for R packages
- Change background color between day and night in R base
- Balance of deposit account using tidyverse / mutate
- How to color in flextable with an as_grouped_data format with equal cells with same values
- Error in x[[1]] : subscript out of bounds
- How to configure chatbot using the shinyChatR package
- Remove rows with dplyr based on two conditions of two variables in R
- Calculate CDF of Weibull distribution in R
- How to delete all strings except some specific name in R?
- Assign date order (mm/dd/yyyy) to a date time character in R
- How to use conditional panel in R Shiny to only hide and show user inputs while still allowing underlying calculations to run?
- What are the ways for the faster processing of raster stack
- Regression with Panel Data (Wide)?
- R -How to pass value in mongolite Query
- Saving output from a function containing loop and ifelse
- A simple pivot_longer on 3D array in R?
- How to add a subscript in R
- MCMC and binary logistic regressions with zero events
- Summary statistics table in R Markdown
- calculate color scale range independently for each facet
- Remove variable label when using tbl_strata() and tbl_summary() from gtsummary package
- Adding superscript and minus signs to data and axis labels in ggplot2
- R equivalent of MATLAB's pascal(n, 1) different column signs
- Scraping federal note yield table from the treasury website