¿Cómo sé que una función o una operación en R está vectorizada?

8

Todavía estoy aprendiendo R. ¿Hay alguna forma automatizada de identificar si una R operationo una functiones vectorized? Para identificar si un Robjeto es un vector, puedo usar is.vector(x), que devuelve TRUEsi xes un vector o Falseno. ¿Hay algo similar para vectorized?

Por ejemplo:

x <- c(1,2,3)
y <- c(3,4,5)
x+y
#[1] 4 6 8

Dado que +se vectoriza, automáticamente addselementos individuales de un vector xcon elementos individuales de y. De lo contrario, tendría que usar un forbucle para lograr una salida similar.

for(i in seq_along(x)){
  cat(sprintf("%i ", x[i]+y[i]))
}
#4 6 8 

Mi comprensión hasta ahora limitada del término Vectorizedimplica la operación automática en elementos que de lo contrario tendría que hacer en elementos individuales de un vector uno por uno.

¿Hay un método recomienda utilizar para identificar si un operationo una functionen Res vectorized?

Gracias.

Anon Mousy
fuente

Respuestas:

3

La vectorización en R básicamente significa que cualquier bucle se mueve a un lenguaje compilado más rápido como C o FORTRAN. Para que eso ocurra, los vectores en cuestión deben ser "atómicos", es decir, deben ser "planos" y homogéneos, y el tipo de vector, con el que puede verificar typeof(), debe tener sentido para las operaciones que se realizan. Si es atómico, entonces está vectorizado.

Puede verificar si un vector es atómico usando is.atomic(). Otro tipo de vector que no está vectorizado se llama "recursivo", que puede verificar usando is.recursive(). Los objetos recursivos pueden contener otros objetos de cualquier tipo, es decir, pueden ser heterogéneos. Las listas y los marcos de datos son recursivos.

Pruebe algo como lo siguiente para obtener una idea de lo atómico frente a lo recursivo:

# Atomic:
1
1:3
c("a", "b", "c")
c(T, F, T)

# Recursive:
list(nums = 1:3, letts = c("a", "b", "c"), logics = c(T, F, T))
data.frame(nums = 1:3, letts = c("a", "b", "c"), logics = c(T, F, T))

# Vectors can be atomic or recursive:
is.vector(1:9) # TRUE
is.atomic(1:9) # TRUE
is.recursive(1:9) # FALSE

is.vector(list(nums = 1:9, chars = "x")) # TRUE
is.atomic(list(1:9)) # FALSE
is.recursive(list(1:9)) # TRUE

# Matrices are atomic, data frames are recursive:
is.vector(matrix(1:9, 3)) # FALSE
is.atomic(matrix(1:9, 3)) # TRUE
is.recursive(matrix(1:9, 3)) # FALSE

is.vector(as.data.frame(matrix(1:9, 3))) # FALSE
is.atomic(as.data.frame(matrix(1:9, 3))) # FALSE
is.recursive(as.data.frame(matrix(1:9, 3))) # TRUE

Creo que puede suponer que muchas, si no la mayoría, de las funciones R que utiliza con mayor frecuencia están vectorizadas. No creo que haya otra forma de verificar esto que no sea mirando la documentación o las funciones internas. Siempre que piense en escribir un bucle for para realizar operaciones simples basadas en elementos, piense en cómo hacerlo usando la vectorización. Con suficiente práctica se convertirá en una segunda naturaleza para ti. Para más detalles, puedo recomendar esta publicación de blog de Noam Ross.

gersht
fuente
@AnonMousy encantado de ayudar. Si la respuesta lo ayudó, ¿consideraría seleccionarla como la respuesta aceptada haciendo clic en √? De esa manera, otros con una pregunta similar también saben qué funcionó.
gersht
0

En principio, debería ser evidente en la página de ayuda, help(function)o ?functiondebería dar la respuesta.

saudic
fuente
Ese es un punto de partida recomendado. Si desea utilizar funciones vectorizadas siempre que sea posible en el programa que escribe, eso podría ser un poco de carga adicional.
Anon Mousy
1
Esto realmente no responde la pregunta. Es solo una sugerencia para RTM.
IRTFM