Richiesto da @ hadley's article on functionals referenced in an answer today, ho deciso di rivisitare un enigma persistente su come funziona la funzione outer
(o meno). Perché questo venga menoPerché il lavoro esterno non funziona come penso io (in R)?
outer(0:5, 0:6, sum) # while outer(0:5, 0:6, "+") succeeds
Questo dimostra come penso outer
dovrebbe gestire una funzione come sum
:
Outer <- function(x,y,fun) {
mat <- matrix(NA, length(x), length(y))
for (i in seq_along(x)) {
for (j in seq_along(y)) {mat[i,j] <- fun(x[i],y[j])} }
mat}
> Outer(0:5, 0:6, `+`)
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 0 1 2 3 4 5 6
[2,] 1 2 3 4 5 6 7
[3,] 2 3 4 5 6 7 8
[4,] 3 4 5 6 7 8 9
[5,] 4 5 6 7 8 9 10
[6,] 5 6 7 8 9 10 11
OK, io non ho il mio indici esattamente allineati per questo esempio, ma non sarebbe così difficile da risolvere. La domanda è: perché una funzione come sum
che dovrebbe essere in grado di accettare due argomenti e restituire un valore (atomico) adatto per un elemento matrix, non può farlo quando viene passata alla funzione base::outer
?
Così @agstudy ha dato ispirazione per una versione più compatta del Outer
e la sua è ancora più compatta:
Outer <- function(x,y,fun) {
mat <- matrix(mapply(fun, rep(x, length(y)),
rep(y, each=length(x))),
length(x), length(y))
Tuttavia, la questione rimane. Il termine "vettorializzato" è alquanto ambiguo e penso che "diadico" sia più corretto, dal momento che sin
e cos
sono "vettorizzati" nel senso comune del termine. Esiste una fondamentale barriera logica per prevedere che outer
espanda i suoi argomenti in modo da poter utilizzare le funzioni non diadiche.
Ed ecco un altro outer
-Errore che è probabilmente simile collegato alla mia mancanza di comprensione di questo problema:
> Vectorize(sum)
function (..., na.rm = FALSE) .Primitive("sum")
> outer(0:5, 0:6, function(x,y) Vectorize(sum)(x,y))
Error in outer(0:5, 0:6, function(x, y) Vectorize(sum)(x, y)) :
dims [product 42] do not match the length of object [1]
le tue funzioni sono ok, ma sto indovinando molto più lentamente, quindi non eccezionale per un'implementazione R di 'outer'; è stato implementato in C++ invece che la versione 'sum' avrebbe probabilmente funzionato – eddi
stai cercando questo nel tuo ultimo esempio:' outer (0: 5, 0: 6, Vectorize (funzione (x, y) sum (x, y))) ' – eddi
@eddi: Avrei svalutato che se offerto come risposta. –