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 № 1Moż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.