Как я могу использовать накапливать, как функция Redu2 в purrr? - PullRequest
0 голосов
/ 11 мая 2018

Я хотел бы использовать функцию accumulate с двумя входными векторами и функцию reduce2. Документация для accumulate подразумевает, что можно задать два входных вектора и что accumulate может работать с reduce2. Однако у меня возникли проблемы.

Вот пример, вдохновленный документацией reduce2.

Это пример из reduce2

> paste2 <- function(x, y, sep = ".") paste(x, y, sep = sep)
> letters[1:4] %>% reduce2(.y=c("-", ".", "-"), paste2)
[1] "a-b.c-d"

Вот несколько попыток использовать accumulate аналогично reduce2. Ни один из них не выполняет итерацию как letters[1:4], так и c("-",".","-").

> letters[1:4] %>% accumulate(.y=c("-", ".", "-"),paste2)
Error in .f(x, y, ...) : unused argument (.y = c("-", ".", "-"))

> letters[1:4] %>% accumulate(c("-", ".", "-"),paste2)
[[1]]
[1] "a"

[[2]]
NULL

> letters[1:4] %>% accumulate(sep=c("-", ".", "-"),paste2)
[1] "a"       "a-b"     "a-b-c"   "a-b-c-d"

Как бы я использовал accumulate, чтобы увидеть промежуточные результаты, приведенные в примере reduce2?

1 Ответ

0 голосов
/ 11 мая 2018

Возможно, что это упущение, когда документация просто не актуальна / немного вводит в заблуждение? Я не мог заставить accumulate принять функцию с тремя аргументами, и я удивлен, что в вашем последнем примере нет ошибки, хотя я предполагаю, что это должно быть paste, которое его выдает. Тот факт, что текст для .f точно такой же для accumulate, что и для reduce, заставляет меня думать, что это просто не функциональность, присутствующая в accumulate. Кроме того, взгляд на источник, кажется, показывает (если я не прочитал), что reduce и reduce2 имеют свою собственную реализацию, но accumulate опирается на base::Reduce. Может стоить выпуска GitHub.

Вот мой лучший способ получить желаемый результат. Это в основном включает в себя вызов reduce2 несколько раз с правым подмножеством входного списка и второстепенным вектором ввода на paste2, что не очень аккуратно или аккуратно. Это может быть не очень аккуратной или аккуратной проблемой. Обратите внимание на использование {} для переопределения поведения %>% по умолчанию при помещении канала LHS в качестве первого аргумента и различного индексирования .x и .y внутри reduce2 (мы хотим сохранить .y один элемент короче .x).

paste2 <- function(x, y, sep = ".") paste(x, y, sep = sep)

library(purrr)
letters[1:4] %>%
  {map_chr(
    .x = 2:length(.),
    .f = function(index) reduce2(
      .x = .[1:index],
      .y = c("-", ".", "-")[1:(index - 1)],
      .f = paste2
    )
  )}
#> [1] "a-b"     "a-b.c"   "a-b.c-d"

Создано в 2018-05-11 пакетом Представ. (v0.2.0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...