[Rd] eval(parse()) within mutate() returning same value for all rows

Dirk Eddelbuettel edd @end|ng |rom deb|@n@org
Fri Dec 29 16:35:20 CET 2023


On 29 December 2023 at 14:13, Mateo Obregón wrote:
| Hi all-
| 
| Looking through stackoverflow for R string combining examples, I found the 
| following from 3 years ago:
| 
| <https://stackoverflow.com/questions/63881854/how-to-format-strings-using-values-from-other-column-in-r>
| 
| The top answer suggests to use eval(parse(sprintf())). I tried the suggestion 

Well:

   > fortunes::fortune(106)

   If the answer is parse() you should usually rethink the question.
      -- Thomas Lumley
         R-help (February 2005)
   
   > 

| and it did not return the expected combines strings. I thought that this might 
| be an issue with some leftover values being reused, so I explicitly eval() 
| with a new.env():
| 
| > library(dplyr)
| > df <- tibble(words=c("%s plus %s equals %s"), 
| args=c("1,1,2","2,2,4","3,3,6"))
| > df |> mutate(combined = eval(parse(text=sprintf("sprintf('%s', %s)", words, 
| args)), envir=new.env()))
| 
| # A tibble: 3 × 3
|   words                args  combined         
|   <chr>                <chr> <chr>            
| 1 %s plus %s equals %s 1,1,2 3 plus 3 equals 6
| 2 %s plus %s equals %s 2,2,4 3 plus 3 equals 6
| 3 %s plus %s equals %s 3,3,6 3 plus 3 equals 6
| 
| The `combined`  is not what I was expecting, as the same last eval() is 
| returned for all three rows.
|  
| Am I missing something? What has changed in the past three years?

Nothing if you use the first answer which relies only on base R and still
works: 

   > words <- c('%s + %s equal %s', '%s + %s equal %s')
   > arguments <- c('1,1,2', '2,2,4')
   > df <- data.frame(words, arguments)
   > df
                words arguments
   1 %s + %s equal %s     1,1,2
   2 %s + %s equal %s     2,2,4
   > df$combined <- apply(df, 1, function(x) do.call(sprintf, c(as.list(strsplit(x[2], ',')[[1]]), fmt = x[[1]])))
   > df
                words arguments      combined
   1 %s + %s equal %s     1,1,2 1 + 1 equal 2
   2 %s + %s equal %s     2,2,4 2 + 2 equal 4
   > 

I am not the best person to answer what may have changed in `dplyr` in those
three years -- and neither is this list which is primarily concerned with
developing R itself.  

Dirk

-- 
dirk.eddelbuettel.com | @eddelbuettel | edd using debian.org



More information about the R-devel mailing list