Especificar los posibles valores de un argumento en una función de R

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.

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 o volumen.

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”

Deja un comentario