tres reutilizar reducir reciclaje para niños ley las importancia ejemplos r

reutilizar - Implementación de reglas de reciclaje estándar



reducir (3)

Lo he usado en el pasado,

expand_args <- function(...){ dots <- list(...) max_length <- max(sapply(dots, length)) lapply(dots, rep, length.out = max_length) }

Una buena característica de R que está relacionada con su naturaleza vectorizada inherente es la regla de reciclaje descrita en Introducción a R en la Sección 2.2.

Los vectores que aparecen en la misma expresión no necesitan todos ser de la misma longitud. Si no lo son, el valor de la expresión es un vector con la misma longitud que el vector más largo que aparece en la expresión. Los vectores más cortos en la expresión se reciclan tan a menudo como sea necesario (quizás fraccionalmente) hasta que coincidan con la longitud del vector más largo. En particular, una constante simplemente se repite.

La mayoría de las funciones estándar usan esto, pero el código que lo hace está oculto en el código C subyacente.

¿Existe alguna manera canónica de implementar las reglas de reciclaje estándar para una función completamente en código R? Es decir, dada una función como

mock <- function(a, b, c) { # turn a, b, and c into appropriate recycled versions # do something with recycled a, b, and c in some appropriately vectorized way }

donde a , b y c son vectores, posiblemente de diferentes longitudes y clases / tipos desconocidos, ¿existe alguna forma canónica de obtener un nuevo conjunto de vectores que se reciclan de acuerdo con las normas de reciclaje estándar? En particular, no puedo suponer que el paso "hacer algo" hará el reciclaje adecuado, así que tengo que hacerlo yo mismo de antemano.


Probablemente usaría el argumento length.out de rep() para hacer la mayor parte del trabajo real.

Aquí hay un ejemplo que crea una función better.data.frame() (realmente debería llamarse "better".data.frame() ), que no impone restricciones en la longitud de los vectores que se entregan como argumentos. En este caso, reciclo todos los vectores a la longitud más larga, ¡pero obviamente puede adaptar esto para satisfacer sus propias necesidades de reciclaje!

better.data.frame <- function(...) { cols <- list(...) names(cols) <- sapply(as.list(match.call()), deparse)[-1] # Find the length of the longest vector # and then recycle all columns to that length. n <- max(sapply(cols, length)) cols <- lapply(cols, rep, length.out = n) as.data.frame(cols) } # Try it out a <- Sys.Date() + 0:9 b <- 1:3 c <- letters[1:4] data.frame(a,b,c) # Error in data.frame(a, b, c) : # arguments imply differing number of rows: 10, 3, 4 better.data.frame(a,b,c) # a b c # 1 2012-02-17 1 a # 2 2012-02-18 2 b # 3 2012-02-19 3 c # 4 2012-02-20 1 d # 5 2012-02-21 2 a # 6 2012-02-22 3 b # 7 2012-02-23 1 c # 8 2012-02-24 2 d # 9 2012-02-25 3 a # 10 2012-02-26 1 b


Una ruta corta y sucia para los argumentos numéricos es confiar en el reciclaje automático de cbind. Por ejemplo:

f.abc <- function(a,b,c) { df.abc <- as.data.frame( suppressWarnings( cbind(a=a, b=b, c=c) ) ) #Then use, for example, with() to use a, b and c inside the data frame, #or apply(df.abc,1, ...) }

Sin embargo, depende en gran medida de que no haya otra causa legítima para las advertencias.