使用 pmap 将参数 tibble 映射到函数 assign 会生成一个列表,而不是环境中的 objects(根据需要)

Mapping a parameter tibble on to the function assign with pmap produces a list, not objects in the environment (as desired)

序言:,但收到相同(不正确)的结果。

我正在尝试通过 purrr::pmap 将一小部分参数传递给 assign。我的参数 tibble 有两列:名称 (chr) 和数据 (tbl_df)。一个可重现的小例子:

x <- c("One", "Two", "Three")

value <- list(
  mtcars,
  iris,
  rock
)

params <- tibble(x = x, value = value)

pmap(params, assign)

输出只是数据帧列表(mtcars、iris、rock),但是没有objects("One"、"Two"、"Three") 在环境中创建(根据需要)。我已经按照上面提到的 SO post 的思路 map2 进行了尝试:

map2(.x = x, .y = value, .f = ~ assign(.x, .y))

...这给出了相同的不需要的输出(数据帧列表)。

TIA

来自答案的基准测试结果

我很好奇这些功能将如何执行。这里唯一的区别是为了节省计算,我创建了一个命名数据帧的小标题,然后应用 get 这是我使用 rbenchmark:

的代码
rbenchmark::benchmark( 

  map2 = {
    x <- c("One", "Two", "Three")

    value <- list(
      "mtcars",
      "iris",
      "rock"
    )

    purrr::map2(.x = x, .y = value, .f = ~ assign(.x, get(.y), envir = .GlobalEnv))
  },

  walk2 = {
    x <- c("One", "Two", "Three")

    value <- list(
      "mtcars",
      "iris",
      "rock"
    )

    purrr::walk2(.x = x, .y = value, .f = ~ assign(.x, get(.y), envir = .GlobalEnv))
  },

  list2env = {
    x <- c("One", "Two", "Three")

    value <- list(
      "mtcars",
      "iris",
      "rock"
    )

    list2env(setNames(lapply(value, get), x), envir = .GlobalEnv)
  },
  replications = 10000,
  columns = c("test", "replications", "elapsed",
              "relative", "user.self", "sys.self")
)

结果:

      test replications elapsed relative user.self sys.self
3 list2env        10000    0.14      1.0      0.14     0.00
1     map2        10000    1.05      7.5      0.91     0.02
2    walk2        10000    4.20     30.0      4.20     0.00

请在 map2 通话中将 envir = .GlobalEnv 添加到您的 assign 中。此外,在这种情况下,map2 会打印出一个列表。如果你不喜欢那样,你可以使用 walk2 如下。

walk2(.x = x, .y = value, .f = ~ assign(.x, .y, envir = .GlobalEnv))

base R 中的另一个选项是将 list 列提取到命名的 list 中并使用 list2env

list2env(setNames(params$value, params$x), envir = .GlobalEnv)