使用 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)
序言:
我正在尝试通过 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)