序言: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
答案 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)