0

I get an error when trying to call my function where dplyr is used inside the function. Does dplyr not work inside R functions?

all_df_yoy <- function(all_df, units) {
  all_df_yoy <- all_df %>% mutate(
    players_units_yoy = units)
}

us_players_all_df_yoy <- all_df_yoy(us_players_all_df, players_units_us)

I get the following error.

Error in compat_lazy_dots(.dots, caller_env(), ..., .named = TRUE) : 
  object 'players_units_us' not found 

However, players_units_us does indeed exist inside the data frame​.

ali.hash
  • 106
  • 1
  • 1
  • 11
  • 2
    This will be a helpful resource to answer your question: https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html – dylanjm May 02 '19 at 21:01
  • Also your function will not return a value as currently written. You can either use `return()` in the last line of the function, or if you just have the last line of the function be an expression not assigned to a variable it will return that value. – qdread May 02 '19 at 21:06
  • 2
    Possible duplicate of [Pass arguments to dplyr functions](https://stackoverflow.com/questions/27975124/pass-arguments-to-dplyr-functions) – divibisan May 02 '19 at 21:11
  • @qdread Actually it will return a value, it will just do so invisibly (ie, it won't print by default, but it's there). For example `f<-function() a<-2; b<-f(); print(b)` will return 2 but will not create a variable `a` outside the function scope. – MrFlick May 02 '19 at 21:48

1 Answers1

2

Without a minimal reproducible example it's impossible to answer this question to your exact scope, but you need to utilize tidyeval to code functions in the same way that library(dplyr) does. Here is a brief example of what you have to do

library(tidyverse)

create_new_col <- function(df, units) {
    units <- enquo(units)
    df %>% 
        mutate(players_units_yoy = !!units)
}

mtcars %>% 
    create_new_col(cyl)
#>     mpg cyl  disp  hp drat    wt  qsec vs am gear carb players_units_yoy
#> 1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4                 6
#> 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4                 6
#> 3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1                 4
#> 4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1                 6
#> 5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2                 8
#> 6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1                 6
#> 7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4                 8
#> 8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2                 4
#> 9  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2                 4
#> 10 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4                 6
#> 11 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4                 6
#> 12 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3                 8
#> 13 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3                 8
#> 14 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3                 8
#> 15 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4                 8
#> 16 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4                 8
#> 17 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4                 8
#> 18 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1                 4
#> 19 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2                 4
#> 20 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1                 4
#> 21 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1                 4
#> 22 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2                 8
#> 23 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2                 8
#> 24 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4                 8
#> 25 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2                 8
#> 26 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1                 4
#> 27 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2                 4
#> 28 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2                 4
#> 29 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4                 8
#> 30 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6                 6
#> 31 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8                 8
#> 32 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2                 4

Created on 2019-05-02 by the reprex package (v0.2.1)

You can read more on this here: https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

If you are new to programming in R, realize that this is a hurdle most users go through when beginning to develop their own packages. So don't worry if it doesn't click at first, become more familiar with R (try writing your functions using base R) and then come back to this topic.

dylanjm
  • 2,011
  • 9
  • 21