Different class returned by expr and exprs ! why?

I have asked this question here, Not sure if that is going to be answered or not, but more than that I am getting more curious now. I apologise, whether that is under community rules or not that a question can't be asked at two places. This is my first question in Rstudio community, Infact I recently joined it got to know via twitter about this.

I am not sure if this has been asked here, But I am very confused here. I am reading this awesome book called Advanced R by Hadley Wickham from here.

There is function called cement that has been described here, I have modified it little bit and trying to understand it.

library(rlang) cement1 <- function(x) { dots <- expr(x) print(class(dots)) #paste(expr_name(x)) }

cement2 <- function(y,z) { dots <- exprs(y,z) print(class(dots)) #paste(purrr::map(dots, expr_name), collapse = " ") }

Running the above cement1 without any parameter returns me the class of dots as "name".

However, when I run the cement2 function with additional parameter, the class returns "list", {simply putting class(expr(x)) returns "name" whereas class(exprs(x)) returns "list"}.

I am not getting my head around this as why it is printing different class returned by expr and exprs. The only difference I thought I knew about them was, one deals with one parameter, other one deals with multiple parameters, but I may be wrong, I might have missed some details.

Original Problem: So, it all started by running these two functions separately by removing the comments section in the code for both cement1 and cement2, when I run the functions Below are the output returned by them:

cement1(Hello) #Returns , Error in type_of(.x) : object 'Hello' not found
cement2(Hello) #Works very well and returns, [1] "y z"

So I tried to find the reason why cement1 failed and then printed their classes and that is when I realized , expr and exprs return different classes.

My question is:

  1. Are they by design(difference in the classes), if yes then why? Or, I am doing some horrible mistake, which I am currently unable to see.

  2. Does cement1 can't work this if not , what is the correct way?

I am sorry for too long sentences, My first language is not English, hence If anything silly is there, Please let me know I shall correct it. I tried to find the answer but could not found by my own.

Thanks for any help.

R Version: 3.4.2 rlang: 0.2.0

1 Like