При сопоставлении параметра с функцией, назначенной с помощью pmap, создается список, а не объекты в среде (по желанию) - PullRequest
0 голосов
/ 13 января 2019

Преамбула: Соответствующий вопрос 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

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Другой вариант в base R - извлечь столбец list в именованный list и использовать list2env

list2env(setNames(params$value, params$x), envir = .GlobalEnv)
0 голосов
/ 13 января 2019

Пожалуйста, добавьте envir = .GlobalEnv к вашему assign при вызове map2. Кроме того, в этом случае map2 будет распечатывать список. Если вам это не нравится, вы можете использовать walk2 следующим образом.

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