2016-05-20 6 views
1

Что такое R-идиоматический способ создания списка, полученного путем применения списка функций к списку аргументов?Применение списка функций к списку аргументов

Например, если список функций и список аргументов, равное число (скажем, трех),

fncs <- list(f1, f2, f3) 
args <- list(x1, x2, x3) 

Я хочу, чтобы получить список значений функции,

fnc_vals <- list(f1(x1), f2(x2), f3(x3)) 

Другими словами, я хочу применить обобщенный вид функции base-R mapply к спискам fncs и args (который применяет одну функцию к списку аргументов).

Это легко может быть сделан:

dapply <- function(args, fncs, ...) { # "diagonal" apply 
    lapply(seq_along(args), function(i) fncs[[i]](args[[i]], ...)) 
} 

fnc_vals <- dapply(args, fncs) 

Однако в мои глаза, это неуклюжая, потому что это было бы более естественно, если это возможно в R, без конвульсий-бежать попарно через функцию и аргументы для создания желаемого списка функциональных значений; в Python, что бы так:

fncs = [f1, f2, f3] 
args = [x1, x2, x3] 
fnc_vals = [f(x) for f, x in zip(fncs, args)] 

Может ли это «живой» Строительство будет осуществляться в R, а?

+2

Попробуйте «Карта» i.e. «Карта (функция (x, y) x (y), fncs, args)' – akrun

ответ

3

Вы можете использовать Map (который mapply с различными по умолчанию) с do.call:

fncs <- list(mean, median, sd) 
args <- list(1:5, 11:13, c(1,1,1,2)) 
Map(function(f, x) do.call(f, list(x)), fncs, args) 
#[[1]] 
#[1] 3 
# 
#[[2]] 
#[1] 12 
# 
#[[3]] 
#[1] 0.5 

Анонимная функция необходима, потому что do.call нуждается в list для второго аргумента.

Или, поскольку вы все равно анонимно записываете, вы можете просто использовать Map(function(f, x) f(x), fncs, args), поскольку @akrun указывает.

+0

Точно, на что я надеялся. Благодаря! – egnha

Смежные вопросы