El lenguaje de pro­gra­ma­ción R es un popular lenguaje de pro­gra­ma­ción es­ta­dí­s­ti­ca utilizado pri­n­ci­pa­l­me­n­te en la ciencia y las ma­te­má­ti­cas para la co­mpu­tación es­ta­dí­s­ti­ca. R es un lenguaje in­te­re­sa­n­te con pe­cu­lia­ri­da­des di­s­ti­n­ti­vas. Una vez lo entiendes, trabajar con este lenguaje puede ser divertido.

¿Qué distingue al lenguaje de pro­gra­ma­ción R?

R no es un lenguaje de pro­gra­ma­ción general como Java o Python. Sirve para un área de apli­ca­ción especial, la co­mpu­tación es­ta­dí­s­ti­ca. En este campo, R se ha mantenido durante años entre los 20 lenguajes de pro­gra­ma­ción más populares, a pesar de la fuerte co­m­pe­te­n­cia.

Lo que hace que R sea especial no es solo el lenguaje en sí, sino todo el paquete. La pro­gra­ma­ción en R suele rea­li­zar­se en un entorno in­ter­ac­ti­vo, con un loop de Read Eval Print (REPL) y ayuda integrada. Este lenguaje de código abierto está re­s­pa­l­da­do por un eco­si­s­te­ma muy de­sa­rro­lla­do. La comunidad mantiene ac­tua­li­za­do el re­po­si­to­rio de paquetes “The Co­m­prehe­n­si­ve R Archive Network” (CRAN). También se aportan co­n­ti­nua­me­n­te conjuntos de datos y libros blancos cie­n­tí­fi­cos sobre nuevos enfoques y paquetes.

En conjunto, estas ca­ra­c­te­rí­s­ti­cas hacen de R el entorno de pro­gra­ma­ción perfecto para la es­ta­dí­s­ti­ca y las ciencias de datos. El carácter in­ter­ac­ti­vo del entorno invita a la in­ve­s­ti­ga­ción y permite el apre­n­di­za­je ameno del lenguaje y las ma­te­má­ti­cas su­b­ya­ce­n­tes.

R: un lenguaje de pro­gra­ma­ción es­ta­dí­s­ti­ca y de datos

R es un lenguaje de pro­gra­ma­ción es­ta­dí­s­ti­ca y conoce conceptos como la di­s­tri­bu­ción normal, las pruebas es­ta­dí­s­ti­cas, los modelos y la regresión. Además de R, existen más lenguajes cie­n­tí­fi­cos co­m­pa­ra­bles. Aparte del producto comercial Matlab, cabe mencionar el joven lenguaje Julia. Otro co­m­pe­ti­dor fuerte en los últimos años también es Python.

A di­fe­re­n­cia de Python, R tiene asi­s­te­n­cia para la pro­gra­ma­ción es­ta­dí­s­ti­ca. La principal di­fe­re­n­cia radica en la forma en que el lenguaje opera sobre los valores. Los datos suelen ser plurales, por lo que en R se suele calcular con varios valores a la vez. Mientras que en casi todos los demás lenguajes el valor más simple es un solo número, en R este es un caso especial.

Veamos el enfoque de R para el pro­ce­sa­mie­n­to de datos con un ejemplo sencillo. Las ope­ra­cio­nes ma­te­má­ti­cas pueden rea­li­zar­se en cualquier lenguaje de pro­gra­ma­ción, también con R. Sumaremos dos números:

# returns 15
10 + 5
R

Hasta ahora, nada inusual. Sin embargo, en R se puede aplicar la misma operación de suma a una lista de números. Co­m­bi­na­mos dos números en una lista y añadimos un valor constante:

# returns 15, 25
c(10, 20) + 5
R

Para los pro­gra­ma­do­res ex­pe­ri­me­n­ta­dos, este es un resultado so­r­pre­n­de­n­te. Ni siquiera un lenguaje moderno y dinámico como Python lo permite:

# throws an error
[10, 20] + 5
R

En R, incluso se pueden sumar dos listas. En este caso, los elementos de la lista no se combinan en una sola lista, sino que se realiza la operación ma­te­má­ti­ca adecuada para cada elemento:

# returns 42, 69
c(40, 60) + c(2, 9)
R

En lenguajes más antiguos como Java o C++, se necesita un bucle para procesar varios elementos de una lista. Esto se debe a que estos lenguajes separan es­tri­c­ta­me­n­te los valores in­di­vi­dua­les (escalares) de las es­tru­c­tu­ras de datos co­m­pue­s­tas (vectores). En R, el vector es la unidad básica: un escalar es un caso especial en la pro­gra­ma­ción de R como vector de un elemento.

Lo especial de la es­ta­dí­s­ti­ca es que la ca­ra­c­te­rí­s­ti­ca precisión ma­te­má­ti­ca se debilita. Se calcula con in­ce­r­ti­du­m­bres y datos im­pe­r­fe­c­tos derivados de la realidad. Siempre puede fallar algo. Por suerte, R es tolerante a los errores hasta cierto punto. El lenguaje puede manejar los valores que faltan sin que se bloquee un script en ejecución.

Ilu­s­tre­mos la solidez del lenguaje con un ejemplo. No­r­ma­l­me­n­te, en cualquier lenguaje de pro­gra­ma­ción se puede provocar un fallo di­vi­die­n­do un número por cero. A R, sin embargo, esto no le supone un problema. El resultado de la división por cero es el valor Inf, que puede ser fá­ci­l­me­n­te filtrado de los datos en un paso posterior de limpieza:

# list of divisors, containing zero
divisors = c(2, 4, 0, 10)
# returns `c(50, 25, Inf, 10)`
quotients = 100 / divisors
# filter out Inf; returns `c(50, 25, 10)`
cleaned_quotients = quotients[quotients != Inf]
R

R es co­m­pa­ti­ble con la POO y la pro­gra­ma­ción funcional

La pro­gra­ma­ción con R es ex­tre­ma­da­me­n­te flexible. El lenguaje no encaja de forma sencilla en la jerarquía de pa­ra­di­g­mas de pro­gra­ma­ción. Aunque se apoya en un sistema POO, es un lenguaje difícil de cla­si­fi­car. En el uso diario, se emplean pri­n­ci­pa­l­me­n­te enfoques fu­n­cio­na­les e im­pe­ra­ti­vos. Destacan sobre todo las ca­ra­c­te­rí­s­ti­cas fu­n­cio­na­les, que son muy adecuadas para el pro­ce­sa­mie­n­to de datos.

Al igual que Ja­va­S­cri­pt, el sistema de objetos sobresale por su fle­xi­bi­li­dad. Las funciones genéricas son co­m­pa­ra­bles a las de Python, que pueden aplicarse a objetos de di­fe­re­n­tes tipos. Por ejemplo, en la pro­gra­ma­ción en R existe la función length(), análoga a la len() de Python.

¿Cómo funciona la pro­gra­ma­ción en R?

La pro­gra­ma­ción en R gira en torno a los datos, porque en eso se basa la es­ta­dí­s­ti­ca. Para de­sa­rro­llar una solución a un problema en R, se necesita un conjunto de datos. Por desgracia, a menudo estos datos no existen en el momento del de­sa­rro­llo. Así que muchas veces empezamos un proyecto de pro­gra­ma­ción en R simulando datos. Es­cri­bi­mos el código, probamos la fu­n­cio­na­li­dad y po­s­te­rio­r­me­n­te su­s­ti­tui­mos los datos de prueba por datos reales.

¿Cómo se ejecuta el código R?

Al igual que Ruby o Python, R es un lenguaje de script dinámico e in­te­r­pre­ta­do. A di­fe­re­n­cia de lo que ocurre en el lenguaje de pro­gra­ma­ción C, en R no hay se­pa­ra­ción entre el código fuente y el código eje­cu­ta­ble. El de­sa­rro­llo suele rea­li­zar­se de forma in­ter­ac­ti­va, es decir, se alimenta al in­té­r­pre­te línea por línea con código fuente, que se ejecuta in­me­dia­ta­me­n­te. Las variables se crean au­to­má­ti­ca­me­n­te cuando se necesitan, y los nombres se vinculan en tiempo de ejecución.

El efecto de esta pro­gra­ma­ción in­ter­ac­ti­va y dinámica es co­m­pa­ra­ble a estar dentro del programa en marcha. Los objetos ya creados pueden exa­mi­nar­se y mo­di­fi­car­se, y las nuevas ideas pueden probarse in­me­dia­ta­me­n­te. El comando help da acceso a la do­cu­me­n­ta­ción de la sintaxis y las funciones:

# view help for `for` syntax
help('for')
# view help for `c()` function
help(c)
R

Los archivos de script pueden cargarse di­ná­mi­ca­me­n­te desde el in­té­r­pre­te. El comando source funciona como el comando equi­va­le­n­te del shell. Cuando se abre, se lee el contenido de un archivo de texto fuente de R y se introduce en la sesión en curso:

source('path/to/file.r')
R

¿Cuál es la sintaxis del lenguaje de pro­gra­ma­ción R?

El lenguaje de scripting utiliza las llaves conocidas de C y Java para delimitar los cuerpos de las funciones y las se­n­te­n­cias de control. A di­fe­re­n­cia de Python, la in­de­n­ta­ción del código no afecta a su función. Los co­me­n­ta­rios comienzan con una al­moha­di­lla, como en Ruby y Python, y no es necesario el punto y coma al final de una sentencia.

Con un poco de ex­pe­rie­n­cia, se puede reconocer el código R in­me­dia­ta­me­n­te, porque el lenguaje tiene algunas pe­cu­lia­ri­da­des. Además del signo igual como operador de asi­g­na­ción, en la pro­gra­ma­ción en R se utilizan dos ope­ra­do­res tipo flecha para las asi­g­na­cio­nes. Esto permite invertir el sentido de la asi­g­na­ción:

# equivalent assignments
age <- 42
'Jack' -> name
person = c(age, name)
R

Otra ca­ra­c­te­rí­s­ti­ca típica del código R es una especie de notación de pseu­doo­b­je­to según el patrón object.method():

# test if argument is a number
is.numeric(42)
R

La función is.numeric parece ser un método numeric() que pertenece a un objeto llamado is. Sin embargo, este no es el caso. En la pro­gra­ma­ción en R, el punto es un carácter regular. La función también podría llamarse is_numeric en lugar de is.numeric.

Para crear los om­ni­pre­se­n­tes vectores en la pro­gra­ma­ción en R, se utiliza la función de co­n­ca­te­na­ción c().

people.ages <- c(42, 51, 69)
R

Si se aplica la función a los vectores, estos se unen para formar un vector co­n­si­s­te­n­te:

# yields `c(1, 2, 3, 4)`
c(c(1, 2), c(3, 4))
R

A di­fe­re­n­cia de la mayoría de los lenguajes de pro­gra­ma­ción, en R la in­de­xa­ción de los elementos de un vector comienza en 1. Esto requiere aco­s­tu­m­brar­se al principio, pero ayuda a evitar los temidos errores off by one. El mayor índice de un vector co­rre­s­po­n­de a la longitud de este:

# create a vector of names
people <- c('Jack', 'Jim', 'John')
# access the first name
people[1] == 'Jack'
# access the last name
people[length(people)] == 'John'
R

Al igual que en Python, también existe el concepto de “slicing” en la pro­gra­ma­ción en R. Con un corte, se puede indexar un área parcial de un vector. Esto se basa en las se­cue­n­cias co­m­pa­ti­bles de forma nativa con R. Creamos una secuencia de números y se­le­c­cio­na­mos una parte:

# create vector of numbers between 42 and 69
nums = seq(42, 69)
# equivalent assignment using sequence notation
nums = 42:69
# using a sequence, slice elements 3 through 7
sliced = nums[3:7]
R

¿Cómo funcionan las es­tru­c­tu­ras de control en la pro­gra­ma­ción en R?

Las ope­ra­cio­nes básicas de la pro­gra­ma­ción en R se definen para los vectores. Así, a menudo no se necesitan bucles, sino que se realiza una operación di­re­c­ta­me­n­te sobre el vector completo, mo­di­fi­ca­n­do los elementos in­di­vi­dua­les. Elevamos al cuadrado los diez primeros números positivos sin un bucle:

nums <- seq(10)
squares <- nums ** 2
squares[3] == 9
R

Cuando se utiliza el R For Loop, es im­po­r­ta­n­te tener en cuenta que no funciona de la misma manera que en C, Java o Ja­va­S­cri­pt. Sin los desvíos a través de una variable de bucle, la iteración se realiza di­re­c­ta­me­n­te sobre los elementos como en Python.

people = c('Jim', 'Jack', 'John')
for (person in people) {
    print(paste('Here comes', person, sep = ' '))
}
R

Por supuesto, existe la bi­fu­r­ca­ción If else en R como es­tru­c­tu­ra de control básica. Sin embargo, en muchos casos esto también puede su­s­ti­tui­r­se por funciones de filtro o por la in­de­xa­ción lógica de vectores. Crearemos un vector con la in­fo­r­ma­ción de la edad y fi­l­tra­re­mos los mayores y menores de 18 años en dos variables re­s­pe­c­ti­va­me­n­te, sin necesidad de un bucle o ra­mi­fi­ca­ción:

# create 20 ages between 1 and 99
ages = as.integer(runif(20, 1, 99))
# filter adults
adults = ages[ages > 18]
# filter children
children = ages[ages < 18]
# make sure everyone is accounted for
length(adults) + length(children) == length(ages)
R

En pro de la exhau­s­ti­vi­dad, el enfoque equi­va­le­n­te con es­tru­c­tu­ras de control:

# create 20 ages between 1 and 99
ages = as.integer(runif(20, 1, 99))
# start with empty vectors
adults = c()
children = c()
# populate vectors
for (age in ages) {
    if (age > 18) {
        adults = c(adults, age)
    }
    else {
        children = c(children, age)
    }
}
R

¿Qué se necesita para empezar a programar en R?

Para empezar a programar en R, todo lo que necesitas es una in­s­ta­la­ción local de R. Se pueden descargar in­s­ta­la­do­res para los pri­n­ci­pa­les sistemas ope­ra­ti­vos. Una in­s­ta­la­ción estándar de R incluye un in­té­r­pre­te GUI con REPL, ayuda integrada y editor. Para una co­di­fi­ca­ción pro­du­c­ti­va, hay que utilizar uno de los editores de código es­ta­ble­ci­dos. Con Rstudio di­s­po­n­drás de una atractiva al­te­r­na­ti­va al entorno R.

¿Para qué proyectos es adecuado R?

La pro­gra­ma­ción en R se utiliza con especial fre­cue­n­cia en la ciencia y la in­ve­s­ti­ga­ción, por ejemplo, en la bioi­n­fo­r­má­ti­ca y el apre­n­di­za­je au­to­má­ti­co. Sin embargo, el lenguaje es adecuado para todos los proyectos que utilizan modelos es­ta­dí­s­ti­cos o ma­te­má­ti­cos. R es menos útil para el pro­ce­sa­mie­n­to de texto puro. Para ello, Python está cla­ra­me­n­te por delante.

Los cálculos y vi­sua­li­za­cio­nes ha­bi­tua­les en las hojas de cálculo pueden su­s­ti­tui­r­se por código R. Esto aporta limpieza, ya que los datos y el código no se mezclan en las celdas. También significa que el código puede es­cri­bi­r­se una vez y aplicarse a varios conjuntos de datos. Además, no hay peligro de so­bre­s­cri­bir la fórmula de una celda cuando se hacen cambios manuales.

Para las pu­bli­ca­cio­nes cie­n­tí­fi­cas, R se considera muy adecuado. La se­pa­ra­ción del código y los datos es lo que hace posible la re­pro­du­ci­bi­li­dad cie­n­tí­fi­ca en primer lugar. El maduro eco­si­s­te­ma de he­rra­mie­n­tas y paquetes permite la creación de conductos de pu­bli­ca­ción efi­cie­n­tes. Las eva­lua­cio­nes y vi­sua­li­za­cio­nes se generan au­to­má­ti­ca­me­n­te a partir del código y los datos y se integran en do­cu­me­n­tos LaTeX o RMarkdown de alta calidad.

Consejo

La base perfecta para tu página web: escoge el alo­ja­mie­n­to web con tráfico ilimitado económico de IONOS.

Ir al menú principal