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

Mateo Obregón obregonm@teo @end|ng |rom gm@||@com
Fri Dec 29 17:55:08 CET 2023


Thanks Dirk for your response.

The "base" R code is just too unwieldy to be easily understandable. The 
eval(parse(sprintf())) solution provided is ungainly too, but at least its 
more understandable from a casual reading of it.

I'll punt this case over to the dplyr people then.

Cheers.

Mateo.
--  
Mateo Obregón
On Friday, 29 December 2023 15:35:20 GMT Dirk Eddelbuettel wrote:
> 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



More information about the R-devel mailing list