2

序言:我试图模仿的相关 SO 问题,但收到了相同(不正确)的结果。

我正在尝试将一组参数传递给assignvia 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)

输出只是数据帧(mtcars、iris、rock)的列表,但没有在环境中创建对象(“One”、“Two”、“Three”)(根据需要)。我已经尝试过map2,按照上面提到的 SO 帖子的思路:

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
4

2 回答 2

2

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

walk2(.x = x, .y = value, .f = ~ assign(.x, .y, envir = .GlobalEnv))
于 2019-01-13T01:23:19.867 回答
2

另一种选择是base Rlist列提取到命名list并使用list2env

list2env(setNames(params$value, params$x), envir = .GlobalEnv)
于 2019-01-13T09:37:07.160 回答