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

时间:2019-01-12 23:45:12

标签: r assign purrr pmap

序言:A related SO question that I tried to emulate,但收到的结果相同(错误)。

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

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

value <- list(
  mtcars,
  iris,
  rock
)

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

pmap(params, assign)

输出只是数据帧(mtcar,虹膜,岩石)的列表,但在环境中(根据需要)没有创建对象(“一个”,“两个”,“三个”)。我已经按照上述的SO帖子尝试过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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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