/ / Zastosowanie listy funkcji do listy argumentów - r, mapply

Zastosowanie listy funkcji do listy argumentów - r, mapply

Co to jest R-idiomatyczny sposób tworzenia listy przez zastosowanie listy funkcji do listy argumentów?

Na przykład, podając listę funkcji i argumenty listy, równe pod względem liczby (powiedzmy trzy),

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

Chcę uzyskać listę wartości funkcji,

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

Innymi słowy, chcę zastosować uogólnioną formę funkcji base-R mapply na listy fncs i args (który stosuje pojedynczą funkcję do listy argumentów).

Można to łatwo zrobić:

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

fnc_vals <- dapply(args, fncs)

Jednak moim zdaniem jest to niezgrabne, ponieważ tobyłoby bardziej naturalne - jeśli to możliwe w R, bez wygięć - aby uruchomić parami poprzez funkcje i argumenty, aby uzyskać pożądaną listę wartości funkcji; w Pytonto by wyglądało tak:

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

Czy ta „zapętlona” konstrukcja może być również zaimplementowana w R?

Odpowiedzi:

3 dla odpowiedzi № 1

Możesz użyć Map (który jest mapply z różnymi ustawieniami domyślnymi) z 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

Funkcja anonimowa jest konieczna, ponieważ do.call potrzebuje list za drugi argument.

Lub skoro i tak piszesz anonimową funkcję, możesz po prostu użyć Map(function(f, x) f(x), fncs, args) jak wskazuje @akrun.