Как выполнить векторизованную операцию с помощью самоопределяемой функции, добавив результаты в список? - PullRequest
0 голосов
/ 17 ноября 2018
library(tidyverse)

ridiculous_function <- function(a, b){
  moo <- a
  baz <- b

list(moo, baz)
}

test <- ridiculous_function("apple", "A")

> test
[[1]]
[1] "apple"

[[2]]
[1] "A"

Этот код создает список элементов a и b, однако я хотел бы запустить функцию параллельно над двумя векторами, а затем поместить все результаты в один и тот же список.

Например, с этими двумя векторами:

fruits10 <- fruit[1:10]
letters10 <- LETTERS[1:10]

Я хотел бы создать список, который производит элементы векторов символов для "apple", "A", "apricot", "B "," авокадо "," C ".. и так далее.Мой реальный сценарий намного сложнее, поэтому мне нужно решение, которое работает с ограничениями моей функции.

Ожидаемый результат:

> test
[[1]]
[1] "apple"

[[2]]
[1] "A"

[[3]]
[1] "apricot"

[[4]] 
[1] "B"

[[5]]
[1] "avocado"

[[6]]
[1] "C"

....

[[19]]
[1] "blueberry"

[[20]]
[1] "T"

Ответы [ 2 ]

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

Вот несколько способов сделать это:

library(tidyverse)

fruits10 <- fruit[1:10]
letters10 <- LETTERS[1:10]

ridiculous_function <- function(a, b){
  moo <- a
  baz <- b

  list(moo, baz)
}

# using mapply, base R for writing packages
mapply(ridiculous_function, fruits10, letters10) %>% 
  split(rep(1:ncol(.), each = nrow(.)))

# using map2, takes two args
map2(fruits10, letters10, ridiculous_function)

# using pmap, can take as many args as you want
list(a = fruits10,
     b = letters10) %>% 
  pmap(ridiculous_function)

Вы запрашиваете результаты в формате плоского списка, чтобы вы могли вытолкнуть в конце каждого из них, но обычно вы хотите сохранить структуру списка.

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

Как насчет:

fruits10 <- fruit[1:10]
letters10 <- LETTERS[1:10]

ridiculous_function <- function(a, b){
  moo <- a
  baz <- b

  list(moo, baz)
}

library(tidyverse)

flatten(map2(fruits10, letters10, ridiculous_function))

, что дает вам

[1]]
[1] "apple"

[[2]]
[1] "A"

[[3]]
[1] "apricot"

[[4]]
[1] "B"

[[5]]
[1] "avocado"

[[6]]
[1] "C"

[[7]]
[1] "banana"

[[8]]
[1] "D"

и т.д ...

...