2012-02-03 12 views
32

Quiero escribir una pequeña función para generar muestras de distribuciones apropiadas, algo así como:¿Está pasando la lista de parámetros nombrados para funcionar?

makeSample <- function(n,dist,params) 
values <- makeSample(100,"unif",list(min=0,max=10)) 
values <- makeSample(100,"norm",list(mean=0,sd=1)) 

La mayor parte del código funciona, pero estoy teniendo problemas encontrar la manera de pasar los parámetros con nombre para cada distribución. Por ejemplo:

params <- list(min=0, max=1) 
runif(n=100,min=0,max=1) # works 
do.call(runif,list(n=100,min=0,max=1)) # works 
do.call(runif,list(n=100,params)) # doesn't work 

supongo que me falta un poco de función de contenedor en algún lugar, pero no puedo entenderlo.

Gracias!

Respuesta

45

Casi allí: tratar

do.call(runif,c(list(n=100),params)) 

Su variante, list(n=100,params) hace una lista en la que el segundo elemento es la lista de parámetros. Utilice str() para comparar la estructura de list(n=100,params) y c(list(n=100),params) ...

1

c(...) tiene un efecto concatenación, o en el lenguaje de FP, un efecto de aplanamiento, por lo que puede acortar la llamada; su código sería:

params <- list(min=0, max=1) 
do.call(runif, c(n=100, params)) 

intente lo siguiente comparación:

params = list(min=0, max=1) 
str(c(n=100, min=0, max=1)) 
str(list(n=100, min=0, max=1)) 
str(c(list(n=100),params)) 
str(c(n=100,params)) 

Parece que si una lista es allí en cualquier momento, el resultado es una lista (que es una característica deseable en este uso estuche)

Cuestiones relacionadas