Использование purrr :: pmap () по-рядному за пределами mutate () - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь использовать purrr :: pmap () для применения пользовательской функции в виде ряда строк в некоторых строках данных.Я могу достичь желаемого конечного результата с помощью цикла for и apply(), но когда я пытаюсь использовать pmap(), я могу получить желаемый результат только в сочетании с mutate (), который в моем реальном прикладном случаебудет недостаточно.

Есть ли способ использовать pmap(), чтобы применить мою пользовательскую функцию и просто распечатать вывод, а не сохранить в новом столбце?

library(dplyr)
library(purrr)
library(tibble)

Создание демонстрационных данных и пользовательской функции

set.seed(57)

ds_mt <- 
  mtcars %>% 
    rownames_to_column("model") %>% 
    mutate(
      am = factor(am, labels = c("auto", "manual")), 
      vs = factor(vs, labels = c("V", "S"))
    ) %>% 
  select(model, mpg, wt, cyl, am, vs) %>% 
  sample_n(3)

foo <- function(model, am, mpg){
  print(
    paste("The", model, "has a", am, "transmission and gets", mpg, "mpgs.")
  )
}

Успешный пример циклического цикла for:

for (row in 1:nrow(ds_mt)) {
  foo(
    model = ds_mt[row, "model"], 
    am    = ds_mt[row, "am"],
    mpg   = ds_mt[row, "mpg"]
  )
}

Успешный пример с использованием apply():

row.names(ds_mt) <- NULL # to avoid named vector as output

  apply(
    ds_mt, 
    MARGIN = 1, 
    FUN = function(ds) 
      foo(
        model = ds["model"],
        am = ds["am"],
        mpg = ds["mpg"]
      )
  ) 

Пример использования pmap() в mutate() - это почти то, что мне нужно.

ds_mt %>% 
  mutate(new_var = 
    pmap(
      .l = 
        list(
          model = model,
          am = am,
          mpg = mpg
        ),
      .f = foo
    ))

НЕИСПРАВНОСТЬ: почему это не работает?

ds_mt %>% 
  pmap(
    .l = 
      list(
        model = model,
        am = am,
        mpg = mpg
      ),
    .f = foo
  )

1 Ответ

0 голосов
/ 27 ноября 2018

Таким образом, после некоторого дополнительного чтения кажется, что это случай для pwalk(), а не pmap(), потому что я пытаюсь получить выходные данные для печати (то есть, побочный эффект), а не для сохранения в кадре данных.

library(dplyr)
library(purrr)
library(tibble)

set.seed(57)

ds_mt <- 
  mtcars %>% 
  rownames_to_column("model") %>% 
  mutate(
    am = factor(am, labels = c("auto", "manual")), 
    vs = factor(vs, labels = c("V", "S"))
  ) %>% 
  select(model, mpg, wt, cyl, am, vs) %>% 
  sample_n(3)

foo <- function(model, am, mpg){
  print(
    paste("The", model, "has a", am, "transmission and gets", mpg, "mpgs.")
  )
}

ds_mt %>% 
  select(model, am, mpg) %>% 
  pwalk(
  .l = .,
  .f = foo
)
...