Home > Net >  Function not using conditional ensym() as expected
Function not using conditional ensym() as expected

Time:01-26

I am trying to create a function that conditionally uses an argument, which when used, is a column of a df.

Here is an example function:

 new_fx <- function(data, x, y, z=NULL){
  x <- ensym(x)
  y <- ensym(y)
  if ( !is.null(z)){
  z <- ensym(z)
  }
  print(head(data[[x]]))
  print(head(data[[y]]))
  if (!is.null(z)){
  print(z)
  }
 }

When z is left NULL, I would like the function to ignore z. However, when any column is passed as z, I would like it to be converted to a symbol by z<- ensym(z).

This is what happens when I try to use the function above:

new_fx(data=iris, x=Species, y=Petal.Width)

# [1] setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica
# [1] 0.2 0.2 0.2 0.2 0.2 0.4

Everything looks good when z is left NULL. But when any other argument is passed:

new_fx(data=iris, x=Species, y=Petal.Width, z=Petal.Length)

# Error in new_fx(data = iris, x = Species, y = Petal.Width, z = Petal.Length) : 
#  object 'Petal.Length' not found

For some reason, the function has issues when the ensym() call is used inside a conditional statement.

Any suggestions?

CodePudding user response:

when you check is.null(), you're evaluating the argument. Use missing() instead

library(rlang)

 new_fx <- function(data, x, y, z){
  x <- ensym(x)
  y <- ensym(y)
  if ( !missing(z)){
  z <- ensym(z)
  }
  print(head(data[[x]]))
  print(head(data[[y]]))
  if (!missing(z)){
  print(z)
  }
 }

 data(iris)
new_fx(data=iris, x=Species, y=Petal.Width)
#> [1] setosa setosa setosa setosa setosa setosa
#> Levels: setosa versicolor virginica
#> [1] 0.2 0.2 0.2 0.2 0.2 0.4
new_fx(data=iris, x=Species, y=Petal.Width, z=Petal.Length)
#> [1] setosa setosa setosa setosa setosa setosa
#> Levels: setosa versicolor virginica
#> [1] 0.2 0.2 0.2 0.2 0.2 0.4
#> Petal.Length

CodePudding user response:

We may need

 new_fx <- function(data, x, y, z=NULL){
  x <- ensym(x)
  y <- ensym(y)
  
  print(head(data[[x]]))
  print(head(data[[y]]))
  if (!missing(z)){
   z<- rlang::ensym(z)
  print(z)
  }
 }

-output

> new_fx(data=iris, x=Species, y=Petal.Width, z=Petal.Length)
[1] setosa setosa setosa setosa setosa setosa
Levels: setosa versicolor virginica
[1] 0.2 0.2 0.2 0.2 0.2 0.4
Petal.Length
  • Related