Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Change R data frame within a function? Why alteration of df causing assign() to fail?

Is it possible to change an R data frame within a function without calling the function from a reference to that object?

For example, say I have a function character_func() that I want to change data frames like mtcars2 so that mpg becomes a character value.

I would like to just use: character_func(mtcars2)
EDIT: so without assigning the function to an object.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

The deparse-substitute trick in this solution is not working.

Example:

mtcars2 <- mtcars
character_func <- function(df) {
  df <- df %>%
    mutate(mpg_c = as.character(mpg))
  ## WARNING occurs when next line runs
  assign(deparse(substitute(df)), df)
}

character_func(mtcars2)

The assign() call returns the warning:

In assign(deparse(substitute(df)), df) :
  only the first element is used as variable name

>Solution :

We need to use the deparse/substitute at the start

library(dplyr)
character_func <- function(df) {
  nm1 <- deparse(substitute(df))
  
  df <- df %>%
    mutate(mpg_c = as.character(mpg))
 
  assign(nm1, df, .GlobalEnv)
}

-testing

> character_func(mtcars2)
> 
> str(mtcars2)
'data.frame':   32 obs. of  12 variables:
 $ mpg  : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl  : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp : num  160 160 108 258 360 ...
 $ hp   : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat : num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt   : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec : num  16.5 17 18.6 19.4 17 ...
 $ vs   : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am   : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear : num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb : num  4 4 1 1 2 1 4 2 2 4 ...
 $ mpg_c: chr  "21" "21" "22.8" "21.4" ...
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading