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.

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" ...

Leave a Reply