Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

converting function names to strings inside purrr::map [duplicate]

Tags:

r

purrr

I'm trying to extract the names of objects that are being mapped over within purrr::map(). Here's a simplified example of the problem.

library(tidyverse)

input <- list(df1 = mtcars, df2 = iris)

map(input, ~ deparse(substitute(.x)))

My SO searches led me to the "deparse(subsitute()" trick. But in this example, it returns

$df1
[1] "..1"

$df2
[1] "..1"

instead of what I want, which is

df1
[1] "df1"

$df2
[1] "df2"

In other words, I need to be able to process the names of the objects in the list within a more elaborate lambda function.

like image 561
DSH Avatar asked Mar 21 '26 23:03

DSH


1 Answers

We can use imap (which calls map2 to pass the names index) instead of map and extract the list names with .y and the values with .x. Here imap is calling map2

library(purrr)
imap(input, ~ .y)
#$df1
#[1] "df1"

#$df2
#[1] "df2"

Or instead of .x, .y, can also use ..1 and ..2

imap(input, ~ ..2)

Basically imap is calling map2

 imap
  function (.x, .f, ...) 
 {
.f <- as_mapper(.f, ...)
map2(.x, vec_index(.x), .f, ...)
  }

If we want to use map, option is to loop over the names or the sequence of list

map(names(input), ~ .x)

and for subsetting the values, use the [[

map(names(input), ~ input[[.x]])

With map, the .x is only the values of the data and the names of the list are not passed into it


If we want to use base R, then an option is Map

Map(function(u, v) v, input, names(input))

or using lapply

lapply(names(input), function(nm) nm)
like image 174
akrun Avatar answered Mar 24 '26 16:03

akrun



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!