2012-08-14 6 views
16

Supongamos que tiene una función f<- function(x,y,z) { ... }. ¿Cómo haría para pasar una constante a un argumento, pero dejando que los otros varíen? En otras palabras, me gustaría hacer algo como esto:Usar outer() con una función multivariable

output <- outer(x,y,f(x,y,z=2)) 

Este código no evalúa, pero hay una manera de hacer esto?

+1

Sabes qué, me di cuenta que a menudo he estado haciendo este tipo de cosas con 'do.call (lapply, c (expand.grid (x, y), la lista (f)))', pero 'outer' es definitivamente mejor y más legible. – Backlin

Respuesta

18
outer(x, y, f, z=2) 

Los argumentos después de la función son argumentos adicionales a la misma, ven ... en ?outer. Esta sintaxis es muy común en R, toda la familia apply funciona igual por ejemplo.

Actualización:

No puedo decir exactamente lo que quiere lograr en su seguimiento de pregunta, pero piensa que una solución en esta forma es probablemente lo que se debe utilizar.

outer(sigma_int, theta_int, function(s,t) 
    dmvnorm(y, rep(0, n), y_mat(n, lambda, t, s))) 

Este calcula una matriz de varianza para cada combinación de los valores en sigma_int y theta_int, utiliza esa matriz para definir una dennsity y lo evalúa en el punto (s) definido en y. No he podido probarlo aunque no conozco los tipos y dimensiones de las variables involucradas.

+0

Ah, es tan simple, tengo mucho que aprender sobre R Ya veo ... ¡Muchas gracias! – Stijn

+0

Sí, es simple ... una vez que lo sabes;) – Backlin

+0

Lamento molestarlo de nuevo, pero ¿qué sucede si tengo una función que depende de otra función? Por ejemplo, supongamos que tengo dos intervalos, y para cada dos elementos fuera de estos intervalos, quiero (i) crear una matriz de varianza asociada y (ii) calcular la densidad en este punto (una distribución normal multivariante). Para crear la matriz de varianza, tengo una función y_mat (n, lambda, theta, sigma). Dado dos intervalos sigma_int y theta_int, quiero hacer algo como z <- outer (sigma_int, theta_int, dmvnorm, x = y, mean = rep (0, n), sigma = y_mat (n, lambda, theta, sigma)). es posible? – Stijn

2

outer (junto con la familia de funciones apply y otros) pasarán argumentos adicionales a las funciones que ellos llaman. Sin embargo, si está tratando con un caso en el que esto no es compatible (optim es un ejemplo), entonces puede usar el enfoque más general de currying. Para curry una función es crear una nueva función que tiene (algunas de) las variables corregidas y, por lo tanto, tiene menos parámetros.

library("functional") 
output <- outer(x,y,Curry(f,z=2)) 
Cuestiones relacionadas