Cuando estamos escribiendo una función en R tenemos que definir los argumentos que contiene. Si esos argumentos son cuantitativos o numéricos, a no ser que estén restringidos por una condición, pueden tomar cualquier valor. Pero si el argumento que estamos escribiendo solo puede adquirir un número finito de categorías, tenemos que acotar sus valores. Os voy a mostrar cómo podemos especificar los posibles valores de un argumento en una función de R. Además, también os mostraré cómo dar error si no se cumple.
Quiero leer...
Definir los posibles valores de un argumento en una función de R
Para comenzar a definir los factores o categorías que puede tomar un argumento de una función de R, vamos a escribir una función.
A partir de la medida del radio, la función que vamos a desarrollar tiene que calcular el área del círculo o el volumen de la esfera. Vamos a llamar a nuestra función circular()
. Por lo tanto, nuestra función tiene que tener dos argumentos:
radio
: metemos la medida del radio. Es una variable numérica.calc
: es un argumento donde indicamos si queremos calcular el área del círculo o el volumen de la esfera. Por lo tanto, es nuestro argumento categórico, que solo puede recibir dos factores:area
ovolumen
.
Para su desarrollo, vamos a emplear la secuencia condicional if else
. Vamos a comenzar escribiendo la función, y luego veremos cómo se comporta.
circular <- function(radio, calc = c("area", "volumen")) { if(calc == "area") { # Fórmula para calcular el área return(2 * pi * radio) } else { # Fórmula para calcular el volumen return(pi * radio^2) }
Fuente de problemas con las posibles categorías de un argumento
Una vez que tenemos ya generada la función circular()
, vamos a someterla a diversas pruebas. Si sólo especificamos el valor del radio (por ejemplo radio = 1
), automáticamente nos va a coger la primera categoría de calc
, que es el área.
circular(radio = 1) [1] 6.283185 Warning message: In if (calc == "area") { : la condición tiene longitud > 1 y sólo el primer elemento será usado
Si ahora lo que queremos es que nos calcule el volumen, tenemos que especificarlo en su argumento.
circular(radio = 1, calc = "volumen") [1] 3.141593
En esta ocasión no nos devuelve ningún mensaje de advertencia ya que se satisfacen todos los argumentos.
Ahora bien, ¿qué pasa si ponemos otro valor en calc
que no sean los dos especificados?
circular(radio = 1, calc = "altura") [1] 3.141593
Como se ha podido comprobar, al poner calc = "altura"
nos devuelve el mismo valor que empleando "volumen"
. ¿Por qué sucede esto?
Esto se debe a la secuencia if else
de su interior. Si no se especifica el argumento calc
, como vimos anteriormente, automáticamente emplea la primera categoría. Si ponemos, calc = "area"
nos devuelve correctamente el área. Como esta restricción está dentro del if
, todo funciona correctamente. Sin embargo, cualquier otro valor que pongamos (y no solo escribiendo volumen
) nos devolverá lo que está dentro de else
. En este caso, no se puso ninguna condición en else
, de ahí que cualquier valor de calc
devuelve el volumen.
Esto pone de manifiesto que es muy importante obligar a que se cumplan con los posibles valores de un argumento en una función de R. Vamos a ver cómo podemos obligar a que se cumpla con los valores de los argumentos especificados.
match.arg() para obligar a que los valores de un argumento sean los especificados
La función match.arg()
es esencial para concretar los posibles valores de un argumento en una función de R. Vamos a completar la función previa añadiendo la línea calc <- match.arg(calc)
.
circular <- function(radio, calc = c("area", "volumen")) { calc <- match.arg(calc) if(calc == "area") { # Fórmula para calcular el área return(2 * pi * radio) } else { # Fórmula para calcular el volumen return(pi * radio^2) } }
Esta función, tal y como está escrita en circular()
, indica que si el argumento calc
no es ni area
ni volumen
nos devuelva un error. Vamos a repetir nuevamente con el valor calc = "altura"
.
circular(radio = 1, calc = "altura") Error in match.arg(calc) : 'arg' should be one of “area”, “volumen”
Vemos que la función match.arg()
ha identificado correctamente que altura
no es un valor permitido de calc
, lo que nos devuelve el consecuente error. Además, nos indica muy acertadamente las categorías posibles que tiene que adquirir calc
.
Hemos visto lo importante que es especificar los posibles valores de un argumento en una función de R. Esto nos evita a cometer errores indeseados y a depurar el código, haciéndolo plenamente robusto. Para poder mejorar la escritura de una función, también podemos mostrar avisos de que faltan argumentos por rellenar al ejecutar la función. Todos estos detalles son importantes para generar funciones precisas e informativas.
1 comentario en «Especificar los posibles valores de un argumento en una función de R»