Итерация функции с использованием R Lapply и списка аргументов функции - PullRequest
1 голос
/ 22 января 2020

У меня есть функция MyFun (a, b, c, d), которая возвращает список фреймов данных и графиков. Аргументы, a, b, c, d, являются просто символьными строками, которые представляют «дату начала», «дату окончания», «текущую версию #» и «предыдущую версию #». Для краткости я буду называть аргументы именами a, b, c, d.

Я хочу запустить MyFun (a, b, c, d) с уникальными наборами аргументов и сохранить весь вывод в список. Для этого я создал список списков:

arg_set1 <- list(a1,b1,c1,d1)

arg_set2 <- list(a2,b2,c2,d2)

arg_set3 <- list(a3,b3,c3,d3)

arg_sets <- list(arg_set1, arg_set2, arg_set3)

В этой части я не уверен: я пытаюсь использовать Lapply для получения списка выходных данных из MyFun (a, b, c, d), используя 3 списка, перечисленных в arg_sets, в качестве входных данных: output <- lapply (arg_sets, MyFun) </p>

Насколько я понимаю, вышеприведенный оператор lapply не работает, поскольку lapply не может знать, что ряд аргументов, которые он должен передать MyFun, содержится в arg_sets [1], arg_sets [2], arg_sets [3]. В качестве альтернативы я также попытался передать входные аргументы lapply в виде фрейма данных со столбцами a, b, c, d и каждой строкой, включающей уникальный набор параметров, которые я хочу lapply передать в MyFun (a , б, c, д). Однако я столкнулся с той же проблемой, что и раньше, со списком входных аргументов; Я не могу определить, чтобы разрешить передавать каждую строку входной матрицы в качестве набора аргументов MyFun (a, b, c, d).

Любой совет будет высоко ценится!

1 Ответ

2 голосов
/ 22 января 2020

Использование do.call

output <- lapply(arg_sets, function(x) do.call(my_fun, x))

См. Этот простой пример,

my_fun <- function(x, y , z) {
   x + y + z
}

arg_sets <- list(a = as.list(1:3), b= as.list(4:6))
lapply(arg_sets, function(x) do.call(my_fun, x))

#$a
#[1] 6

#$b
#[1] 15

Если вместо списка вы создаете вектор аргументов, вы можете изменить вышеуказанную функцию как

arg_set1 <- c(a1,b1,c1,d1)
arg_set2 <- c(a2,b2,c2,d2)
arg_set3 <- c(a3,b3,c3,d3)
arg_sets <- list(arg_set1, arg_set2, arg_set3)

lapply(arg_sets, function(x) do.call(my_fun, as.list(x)))
...