2 Sintaxis básica

La sintaxis en R es muy similar a la de otros lenguajes de programación como JAVA o C. Las normas básicas que definen la sintaxis de R son:

  • No se tienen en cuenta los espacios en blanco: podemos o no dejar espacios para que el código se pueda ordenar de forma adecuada y poder entenderse.
plot(pressur e)
plot( pressure )
  • Se distinguen las mayúsculas y minúsculas (“case sensitive”): para variables en el código, podemos crear diferentes variables con nombres iguales pero alternando mayúsculas y minúsculas.
LETTERS
letters
  • Se pueden incluir comentarios: como vimos anteriormente los comentarios se utilizan para añadir información en el código.
plot(pressur e) # da error

# grafico press vs temp
plot(pressure)

plot(pressure, # grafico press vs temp
     pch = 19, # cambio el tipo de puntos vacios a puntos llenos 
     col= "blue" # uso color azul para rellenarlos  
     )
  • No es necesario terminar cada sentencia con el carácter de punto y coma (;): en la mayoría de lenguajes de programación, es obligatorio terminar cada sentencia con este carácter. En cambio, en R podemos o no terminar de esta forma.
pressure; plot(pressure)

2.1 R calculadora

Ver tablas resumen de operadores aritméticos y lógicos (al final del capítulo)

4 + 9
4 - 
  3 *
  1
# 4%1
4>3
4 == 3
4 == 4

(4 + 5 ) * 7 - (36/18)^3

(Recordando de la primaria el orden de las operaciones: paréntesis < exponentes (potencia o raiz) < productos/división < suma/resta)

Ej 1: ¿Está bien la siguiente expresión? 5 + 3 * 10 %/% 3 == 15 Agregue paréntesis para que la expresión dé un resultado contrario.


Rendimiento de trigo en función de la severidad de fusariosis de la espiga (Madden and Paul 2009)

El intercepto de la regresión lineal estimada (rendimiento de trigo primaveral libre de enfermedad) fue de 4.10 t/ha, y la pendiente fue de 0.038 t/ha por unidad de aumento de la severidad de la enfermedad. El tipo de trigo tuvo efecto significativo en el intercepto pero no en la pendiente: trigo inviernal tuvo, en promedio, 0.85 t/ha mas rendimiento que el trigo primaveral.

¿Cuánto sería el rendimiento de ambas variedades de trigo con 0, 1, 10 o 20% de severidad de la enfermedad?

rto_prim_sev <-
rto_prim_0 <-

rto_inv_sev <-
rto_inv_0 <-


Algunos cálculos

sqrt(3) # 3^0.5
2^(1/3) # ^(1/n)

log(10)
log(10, base=10)

round(4.3478, digits=3)  # ceiling(4.3478) floor(4.3478)

que pasa cuando redondeamos a 0 digitos 4.5 y 3.5?

# Ej 1: 5 + (3 * 10) %/% 3 == 15

# Ej 2: 4.1 - 0.038 * 10; (1-(3.72/4.1))*100

2.2 Funciones

Una función es un conjunto de sentencias organizadas conjuntamente para realizar una tarea específica. Los paquetes son básicamente un set de funciones generadas por los autores de los mismos pero el usuario puede crear sus propias funciones. La sintaxis básica de una función de R es la siguiente:

nombre_funcion <- function(arg_1, arg_2, ...) {
   cuerpo_de_la_función
  
   output # return()
}

Las diferentes partes de una función son:

  • Nombre de la función: este es el nombre real de la función. Se almacena en el entorno R como un objeto con este nombre. Generalmente, el nombre es intuitivo, por ejemplo, mean es la función que calcula la media, round es la funión que redondea un número.

  • Argumentos: Un argumento es un marcador de posición. Cuando se invoca una función, se pasa un valor al argumento. Los argumentos son opcionales; es decir, una función puede no contener argumentos. También los argumentos pueden tener valores por defecto.

  • Cuerpo de la función: el cuerpo de la función contiene una colección de sentencias que definen lo que hace la función.

  • Valor de retorno: el valor de retorno de una función es la última expresión en el cuerpo de la función que se va a evaluar.

numb <- 1:6
round(mean(numb)) # floor() # ceiling() trunc() 

Si es necesario, el usuario puede generar sus propias funciones.

Al reportar los resultados de los tests de comparaciones de medias obtenidas luego del análisis de varianza es interesante agregar en los párrafos de los resultados cuánto se incrementó o se redujo un tratamiento en referencia a un testigo en términos porcentuales. Genere una función que permita realizar estos cálculos. Tome como ayuda este link para cotejar sus resultados.

perc_change <- function(v1, v2) 
{
  pc <- (v2-v1)/v1 *100
  return(paste(pc, "%"))
}

perc_change(80, 90)

es lo mismo aumentar de 0.5 a 1 que de 1 a 1.5?

cuánto es la diferencia porcentual de tener 20% de fusarium en un trigo primaveral en relación a uno invernal?

Claro que en la inmensa comunidad de usuario de R, ya hubo alguien que incluyó esa función en un paquete…

#percentua relative differences 
quantmod::Delt(80,90)*100
80+(80*0.125)
quantmod::Delt(90,80)*100
90+(-90*0.1111111) 

Otro ejemplo de la utilidad de estas funciones “user-defined” es la preparación de soluciones partiendo de un stock o fuente a diluir, usando la equivalencia:

\[c1 * v1 = c2 * v2\]

Obviamente tanto \(c1;c2\), como \(v1;v2\), están en las mismas unidades. Para nuestra comodidad \(c=\%\) y \(v=ml\).

Nos indican que preparemos 500 ml de una solución desinfectante de NaOCl al 5%, partiendo de una lavandina concentrada (55 g Cl/L). La pregunta que del millón es: ¿qué volumen de lavandina preciso? Por lo tanto debemos despejar V1 de la equivalencia, o sea, sería nuestro output de nuestra función.

Empecemos los cálculos:

  1. Si el NaOCl tiene un peso molecular de 74.5 g y el Cl pesa 35.5 g, este representa el 47.6% de la molécula de NaOCl. Por lo tanto podemos decir que la lavandina comercial posee x NaOCl = Cl/0.476 en 1 L, o bien x NaOCl % = x NaoCl/10

  2. Si deseamos preparar 500 ml de NaOCl al 5% para la desinfección (2.5% de Cl activo, aprox.) debemos obtener: \[v1 = (c2*v2)/c1\]

vol_lavandina  <- function(c1, c2, v2){
  c1 <- (c1/0.476)/10 # pasar g/L a %
  c2 <- c2            # concentración que me pide el protocolo (%)
  v2 <- v2            # volumen de la solución que deseo (ml)
  v1 <- (c2*v2)/c1    # aliquota que debo usar
  
  return(paste("Coloque", 
               round(v1,1), 
               "ml de lavandina y enrase con agua hasta completar", 
               v2, "ml"))
}
vol_lavandina(55, # g cloro / L (Lavandina)
          5, # % ClONa deseada
          500) # ml de la solución deseada
#> [1] "Coloque 216.4 ml de lavandina y enrase con agua hasta completar 500 ml"

Ej: Generar funciones que automaticen los cálculos de:
i) Pasar un muestreo de espigas/m a kg/ha (inputs: metros muestreados, ancho de hileras, espigas obtenidas, peso seco medio de espiga)
ii) Rendimiento de soja ajustado 13,5% humedad (inputs: tamaño de parcela; kg de soja; humedad)
iii) Grados celsius a fahrenheit
iv) Cálculo de dosis de urea a fertilizar en un trigo al macollaje (inputs: N disponible, rinde objetivo, N/Ton de grano, % de N en fertilizante)
v) cálculo de kg de semilla a sembrar (inputs: densidad objetivo; P1000; PG%)

2.3 Tablas resumen

Table 2.1: Operadores aritméticos
Operador Detalle
x + y Suma de x e y
x - y Resta de x menos y
x * y Multiplicación
x / y División de x por y
x %/% y Parte entera de la división de x por y
x %% y Resto de la división de x por y
x ^ y x elevado a y-ésima potencia (equivalente a **)



Table 2.2: Operadores lógicos
Operador Prueba.lógica
x < y x menor que y?
x <= y x menor o igual que y?
x > y x mayor que y?
x >= y x mayor o igual que y?
x == y x igual que y?
x != y x diferente que y?



Table 2.3: Funciones matemáticas
Operador Detalle
sqrt(x) raiz de x
exp(y) exponencial de y
log(x) logaritmo natural de x = ln
log10(x) logaritmo base 10 de x
sum(x) suma todos los elementos de x
prod(x) producto de todos los elementos de x
round(x, n) redondea x a n-digitos



Table 2.4: Algunos atajos comúnmente usados
Teclas Detalle
Alt+Shift+K panel de todos los atajos
Ctrl+Z / Ctrl+Shift+Z undo/redo
Alt+ - <-
Ctrl+r corre la línea/bloque completa de código
Ctrl+l limpia la consola
Ctrl+Shift+c silencia la línea de código
Ctrl+Shift+d duplica la línea de código
Ctrl+i indexa el bloque de código

Referencias

Madden, LV, and PA Paul. 2009. “Assessing Heterogeneity in the Relationship Between Wheat Yield and Fusarium Head Blight Intensity Using Random-Coefficient Mixed Models.” Phytopathology 99 (7): 850–60.