R Language
Escribiendo funciones en R
Buscar..
Funciones nombradas
R está lleno de funciones, después de todo es un lenguaje de programación funcional , pero a veces la función precisa que necesita no se proporciona en los recursos básicos. Posiblemente podría instalar un paquete que contenga la función, pero ¿tal vez sus requisitos son tan específicos que ninguna función prefabricada cumple con los requisitos? Entonces te queda la opción de hacer el tuyo.
Una función puede ser muy simple, hasta el punto de ser bastante inútil. Ni siquiera tiene que tomar una discusión:
one <- function() { 1 }
one()
[1] 1
two <- function() { 1 + 1 }
two()
[1] 2
Lo que está entre las llaves { }
es la función propiamente dicha. Siempre que pueda colocar todo en una sola línea, no son estrictamente necesarios, pero pueden ser útiles para mantener las cosas organizadas.
Una función puede ser muy simple, pero muy específica. Esta función toma como entrada un vector ( vec
en este ejemplo) y genera el mismo vector con la longitud del vector (6 en este caso) restada de cada uno de los elementos del vector.
vec <- 4:9
subtract.length <- function(x) { x - length(x) }
subtract.length(vec)
[1] -2 -1 0 1 2 3
Observe que length()
es en sí misma una función pre-suministrada (es decir, Base ). Por supuesto, puede usar una función previamente hecha por sí misma dentro de otra función hecha por sí misma, así como asignar variables y realizar otras operaciones mientras abarca varias líneas:
vec2 <- (4:7)/2
msdf <- function(x, multiplier=4) {
mult <- x * multiplier
subl <- subtract.length(x)
data.frame(mult, subl)
}
msdf(vec2, 5)
mult subl
1 10.0 -2.0
2 12.5 -1.5
3 15.0 -1.0
4 17.5 -0.5
multiplier=4
se asegura de que 4
sea el valor predeterminado del argumento multiplier
, si no se da ningún valor al llamar a la función 4
se usará lo que se usará.
Los anteriores son todos ejemplos de funciones nombradas , llamadas simplemente porque se les han dado nombres ( one
, two
, subtract.length
, subtract.length
, etc.)
Funciones anonimas
Una función anónima es, como su nombre lo indica, no se le asigna un nombre. Esto puede ser útil cuando la función es parte de una operación más grande, pero en sí misma no ocupa mucho lugar. Un caso de uso frecuente para funciones anónimas está dentro del *apply
familia de funciones de base.
Calcule la raíz cuadrada media para cada columna en un data.frame
:
df <- data.frame(first=5:9, second=(0:4)^2, third=-1:3)
apply(df, 2, function(x) { sqrt(sum(x^2)) })
first second third
15.968719 18.814888 3.872983
Cree una secuencia de paso-longitud desde el valor más pequeño hasta el más grande para cada fila en una matriz.
x <- sample(1:6, 12, replace=TRUE)
mat <- matrix(x, nrow=3)
apply(mat, 1, function(x) { seq(min(x), max(x)) })
Una función anónima también puede valerse por sí misma:
(function() { 1 })()
[1] 1
es equivalente a
f <- function() { 1 })
f()
[1] 1
Fragmentos de código RStudio
Esto es solo un pequeño truco para aquellos que usan funciones autodefinidas a menudo.
Escribe "fun" RStudio IDE y pulsa TAB.
El resultado será un esqueleto de una nueva función.
name <- function(variables) {
}
Uno puede definir fácilmente su propia plantilla de fragmento, es decir, como la que se muestra a continuación
name <- function(df, x, y) {
require(tidyverse)
out <-
return(out)
}
La opción es Edit Snippets
en el menú Global Options -> Code
.
Pasando nombres de columna como argumento de una función
A veces, uno quisiera pasar nombres de columnas de un marco de datos a una función. Pueden proporcionarse como cadenas y usarse en una función usando [[
. Veamos el siguiente ejemplo, que imprime en la consola R estadísticas básicas de las variables seleccionadas:
basic.stats <- function(dset, vars){
for(i in 1:length(vars)){
print(vars[i])
print(summary(dset[[vars[i]]]))
}
}
basic.stats(iris, c("Sepal.Length", "Petal.Width"))
Como resultado de ejecutar el código anterior, los nombres de las variables seleccionadas y sus estadísticas de resumen básicas (mínimos, primeros cuantiles, medianas, medias, terceros cuantiles y máximos) se imprimen en la consola R. El código dset[[vars[i]]]
selecciona el elemento i-th del argumento vars
y selecciona una columna correspondiente en el conjunto de datos de entrada declarado dset
. Por ejemplo, declarar el iris[["Sepal.Length"]]
solo imprimirá la columna Sepal.Length
del conjunto de datos del iris
como un vector.