Преамбула: Соответствующий вопрос SO, который я пытался эмулировать , но получил тот же (неправильный) результат.
Я пытаюсь передать параметр в 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)
Выходные данные - это просто список фреймов данных (mtcars, iris, rock), но никакие объекты ("One", "Two", "Three") не создаются в среде (по желанию) . Я попробовал map2
, как указано в сообщении SO, упомянутом выше:
map2(.x = x, .y = value, .f = ~ assign(.x, .y))
... который выдает тот же нежелательный вывод (список фреймов данных).
ТИА
Сравнительный анализ результатов из ответов
Мне было любопытно, как эти функции будут выполнять. Единственное отличие состоит в том, что для сохранения вычислений я создаю тиббл из именованных фреймов данных, затем применяю 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