2012-08-15 14 views

Respuesta

24

Un bucle en el nivel R no es vectorizado. Un bucle R llamará al mismo código R para cada elemento de un vector, que será ineficiente. Las funciones vectorizadas generalmente se refieren a aquellas que toman un vector y operan en todo el vector de una manera eficiente. En última instancia, esto implicará algo de "loop", pero como ese bucle se está realizando en un lenguaje de bajo nivel como C, puede ser altamente eficiente y adaptado a la tarea en particular.

considerar esta función tonto para añadir pairwise los elementos de dos vectores

sillyplus <- function(x, y) { 
    out <- numeric(length = length(x)) 
    for(i in seq_along(x)) { 
     out[i] <- x[i] + y[i] 
    } 
    out 
} 

Se da el resultado correcto

R> sillyplus(1:10, 1:10) 
[1] 2 4 6 8 10 12 14 16 18 20 

y está vectorizada en el sentido de que puede operar en vectores enteros a la vez , pero no es vectorizado en el sentido que describo anteriormente porque es excepcionalmente ineficiente. + se vectoriza en el nivel C en R así que realmente solo necesitamos 1:10 + 1:10, no un bucle explícito en R.

La forma habitual de escribir una función vectorizada es usar funciones R ya existentes que ya están vectorizadas. Si desea comenzar desde cero y lo que desea hacer con la función no existe como una función vectorizada en R (impar, pero posible), entonces tendrá que ensuciarse las manos y escribir las agallas de la función en C y prepare un pequeño contenedor en R para llamar a la función C que escribió con el vector de datos en el que desea que funcione. Hay formas con funciones como Vectorize() de simular la vectorización para funciones R que no están vectorizadas.

C no es la única opción aquí, FORTRAN es una posibilidad como es C++ y, gracias a Dirk Eddelbuettel & Romain Francois, este último es mucho más fácil de hacer ahora con la RCPP paquete.

7

Una función vectorizada devolverá un vector de la misma longitud que uno de sus argumentos. En general, uno puede obtener dicha función usando combinaciones de funciones incorporadas como "+", cos o exp que también están vectorizadas.

vecexpcos <- function(x) exp(cos(x)) 
vecexpcos((1:10)*pi) 
> vecexpcos((1:10)*pi) 
# [1] 0.3678794 2.7182818 0.3678794 2.7182818 0.3678794 2.7182818 0.3678794 2.7182818 0.3678794 2.7182818 

Si es necesario utilizar una función no vectorizada como sum, puede que tenga que invocar mapply o Vectorize con el fin de obtener el comportamiento deseado.

Cuestiones relacionadas