######################Computación estadistica 2018-3######################
##############2da tarea practica: funciones###################
### Autores: Johan Andres Forigua Rodriguez & Julián David Gómez Ballén########
### Estudiantes Universidad Nacional de Colombia sede Bogotá
### Facultad de Ciencias Agrarias, Departamento de Agronomia


####################Punto 1######################
library(lattice)  #Activar libreria lattice, necesaria para ejecutar el grafico
#Introducción de los valores de temperatura por localidad
H1=c(62,50,46,44,43,41,43,45,41,36,41,42,48,51,60,68,71,61,56,55,66,72,65,70,69,59,56,54,59,67,61)
H2=c(39,40,37,37,37,40,42,47,43,45,44,45,55,46,41,44,48,49,45,40,38,41,41,39,42,42,47,46,43,43,41)
#Creación de la función clima.loc
clima.loc <- function(L1,L2) {#Se crean los dos argumentos, Localidad 1 y 2
  D <- c(1:length(L1)) #Se crea el vector, dias del mes
  Fahrenheit<- data.frame(cbind(D,L1,L2)) # Creamos data frame con las variables, dia del mes, temperatura L1 y L2
  #Posteriormente se renombran las columnas
  names(Fahrenheit)[1] <- "Día"
  names(Fahrenheit)[2] <- "L1 (°F)"
  names(Fahrenheit)[3] <- "L2 (°F)"
  #Calculo de la media por localidad, se guarada en vector mL1 y mL2, tambien se le asigan texto
  mL1<-mean(L1)
  TmL1 <- paste("Media Localidad 1:",mL1)
  mL2<-mean(L2)
  TmL2 <- paste("Media Localidad 2:",mL2)
  #For, para encontar el numero de días donde la temperatura estuvo por debajo de la media
  a <- 0
  for (n in L1) {
    if(n<mL1) a<- a+1 #a es el numero de dias por localidad por debajo de la media
  }
  Ta <- paste("numero de días por debajo de la media L1:",a)
  b <- 0
  for (n in L2) {
    if(n<mL2) b<- b+1
  }
  Tb <- paste("numero de días por debajo de la media L2:",b)
  #El siguiente ifelse se utilizo para encontar los días del mes donde la temperatura de L1 fue mayor a la de L2
  #así que primero pusimos que si se cumplia la condición nos mostarra el dia del mes y si no un NA
  #Luego de esto con la función is.na() eliminamos los Na, y nos resulta un vector con los días donde L1>L2
  #Se le agrego texto y se guardo en Td
  d<- ifelse(L1>L2,D,NA)
  d <- d[is.na(d) == F]
  Td <- c("Días del mes donde L1 mayor a L2: ")
  ##Para este punto donde queremos encontrar la maxmima diferencia lo que se hizo fue optener un vector de la diferencia
  #en valor absoluto con la función abs() posteriormente con el condicional se puso que donde este valor coincidiera nos mostrara
  # el dia con el vector D, si no un NA, posteriormente se eliminaron los NA y el valor resultante indica que día
  #se presento la maxima diferencia que en este ejemplo fue de 31 °F y ocurrio en dos días por lo tanto se muestran los dos.
  q <- (abs(L1-L2) )
  x=ifelse(q==max(q),D,NA)
  x <- x[is.na(x) == F]
  Tx= paste("maxima diferencia de temperatura fue de",max(q),"°F el o los días del mes numero:")
  dif=abs(L1-L2)
  #Para esta parte el objetivo es encontar los días donde la diferencia fue de al menos 3 grados por lo tanto se creo un for
  #cuyo condicional me va sumando una unidad cuando la condición se cumple y al final obtendre un vector con el valor 
  #De numero de días donde la temperatura fue igual o mayor a 3.
  e=0
  for (n in dif) {
    if(n>=3) e=e+1
  }
  Te=paste("Numero de días donde la diferencia de temperatura es mayor o igual a 3:", e)
  #Para convertir los datos de °F a °C se utilizo la ecuación CF=(°F-32)/1.8 y con la función round()se dejo con dos decimales
  #luego se creo un data.frame con D=Día del mes, celcius1=L1 en °C y celcius2=L2 en °c igualmente.
  celciusL1=round(((L1-32)/1.8),2)
  celciusL2=round(((L2-32)/1.8),2)
  celcius <- data.frame(cbind(D,celciusL1,celciusL2))
  names(celcius)[1] <- "Día"
  names(celcius)[2] <- "L1 (°C)"
  names(celcius)[3] <- "L2 (°C)"
  
  #Finalmente se crea un grafico con la libreria lattice,  creando un nuevo datframe 
  #conformado por la variable dia del mes, localida, temperatura, luego utilizando la función xyplot() se creo el grafico
  #donde Temp  ~Dia.mes y con la función group, se agrupo por localidad, creando las dos lineas, con auto,key se inserta y modifica la leyenda
  Localidad <-c(rep("L1",length(L1)),rep("L2",length(L2)))
  Temp <- c(L1,L2)
  Dia.mes <- c((1:length(L1)),(1:length(L2)))
  t=data.frame(Dia.mes,Localidad,Temp)
  uu<- xyplot(Temp  ~Dia.mes,t,grid=T,group=Localidad,auto.key = list(columns=2,lines=T,points=F,"topleft"),type = "l",xlab = "Día del mes",ylab = "°C",lwd=2,main="Clima del mes por localidad")
  
  #se utilizo return y list para que imprimiera en formato lista todos los vectores guardados, ya mencionados.
  return(list(Fahrenheit,TmL1,TmL2,Ta,Tb,Td,d,Tx,x,Te,celcius,uu))
}

clima.loc(H1,H2)
## [[1]]
##    Día L1 (°F) L2 (°F)
## 1    1      62      39
## 2    2      50      40
## 3    3      46      37
## 4    4      44      37
## 5    5      43      37
## 6    6      41      40
## 7    7      43      42
## 8    8      45      47
## 9    9      41      43
## 10  10      36      45
## 11  11      41      44
## 12  12      42      45
## 13  13      48      55
## 14  14      51      46
## 15  15      60      41
## 16  16      68      44
## 17  17      71      48
## 18  18      61      49
## 19  19      56      45
## 20  20      55      40
## 21  21      66      38
## 22  22      72      41
## 23  23      65      41
## 24  24      70      39
## 25  25      69      42
## 26  26      59      42
## 27  27      56      47
## 28  28      54      46
## 29  29      59      43
## 30  30      67      43
## 31  31      61      41
## 
## [[2]]
## [1] "Media Localidad 1: 54.9032258064516"
## 
## [[3]]
## [1] "Media Localidad 2: 42.8064516129032"
## 
## [[4]]
## [1] "numero de días por debajo de la media L1: 14"
## 
## [[5]]
## [1] "numero de días por debajo de la media L2: 16"
## 
## [[6]]
## [1] "Días del mes donde L1 mayor a L2: "
## 
## [[7]]
##  [1]  1  2  3  4  5  6  7 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
## [24] 30 31
## 
## [[8]]
## [1] "maxima diferencia de temperatura fue de 31 °F el o los días del mes numero:"
## 
## [[9]]
## [1] 22 24
## 
## [[10]]
## [1] "Numero de días donde la diferencia de temperatura es mayor o igual a 3: 27"
## 
## [[11]]
##    Día L1 (°C) L2 (°C)
## 1    1   16.67    3.89
## 2    2   10.00    4.44
## 3    3    7.78    2.78
## 4    4    6.67    2.78
## 5    5    6.11    2.78
## 6    6    5.00    4.44
## 7    7    6.11    5.56
## 8    8    7.22    8.33
## 9    9    5.00    6.11
## 10  10    2.22    7.22
## 11  11    5.00    6.67
## 12  12    5.56    7.22
## 13  13    8.89   12.78
## 14  14   10.56    7.78
## 15  15   15.56    5.00
## 16  16   20.00    6.67
## 17  17   21.67    8.89
## 18  18   16.11    9.44
## 19  19   13.33    7.22
## 20  20   12.78    4.44
## 21  21   18.89    3.33
## 22  22   22.22    5.00
## 23  23   18.33    5.00
## 24  24   21.11    3.89
## 25  25   20.56    5.56
## 26  26   15.00    5.56
## 27  27   13.33    8.33
## 28  28   12.22    7.78
## 29  29   15.00    6.11
## 30  30   19.44    6.11
## 31  31   16.11    5.00
## 
## [[12]]

############################################################
############################################################

###########################Ejercicio 2#####################################
H1 <- function(x={2;y <- 1},y=0) x+y^2
H1()  #al no definir datos dentro de la función, esta toma los valores por default
## [1] 2
#asi la función define a x como un conjunto de comandos, donde define el valor
#de y en 1 y el segundo comanado define a x con el valor de 2
# por lo tanto arojará como resultado 2+1^2=3
H1(1) #Debido a que en este caso se esta definiendo el valor de x a 1, y no el valor de y;
## [1] 1
#la función iguala a x=1 y y es dejado con su valor default y=0 por lo tanto la funcion 
#ejecuta la operación como 1+0^2
H1(1,1)#En esta ocación se estan definiendo las dos variables de la función, X y y son iguales a 1
## [1] 2
#por lo tanto la funcion toma los valores suministrados y no los datos default
# ejecutando la operacion como 1+1^2=2

#########################Ejercicio 3######################################
H2 <- function(x=z){
  z <- 100
  x
}
H2()  #en este caso la funcion posee dos variables, donde x es igual a z, y dentro de los comandos se define a z 
## [1] 100
#con el valor de z, asi la funcion al ejecutarse sin nigun valor, toma el valor definido por default  asi x=z 
#y z es igual 100, por lo tanto la funcion devuelve el valor de z al llamar a x 

#########################Ejercicio 4######################################
#Apoyado en el operador infijo construido, construya otro operador con 
#triple asterisco que muestre en consola las palabras amarillo, azul y 
#rojo, cada una en su color respectivo.
library(crayon) #Primero instalamos la libreria crayon, necesria para imprimir texto con color en la consola
#Función pate=() me une lo que se encuentre dentro, y gracias a la libreria ponemos color de la siguiente forma
#color("texto")
#Finalmente cat() imprime este texto con el color asiganado
`%***%` <- function(){
  color=paste0(yellow("Amarillo "),blue("Azul "),red("Rojo"))
  cat(color)
}
###NOTA: Al correr este codigo en R se observan de color correspondiente las palabras Amarillo azul y rojo,
#la copilación no permite observar esto
`%***%`()
## Amarillo Azul Rojo
#########################Ejercicio 5. la funcion normal#########################################
#Se establece la función y todos loa comandos necesarios para la ehjecucion de la funcion. 
f <- function(desde=0,hasta=0,cada=0 ){
  a <- 1/sqrt(2*pi) #defino la primera parte de la ecuacion 
  x <- seq(desde,hasta,cada) #creo las x necesarias para analizar
  ex <- (-x^2)/2    #Se define el exponente de la ecuacion normal
  fx <- a*exp(1)^ex    #Ecuacion normal 
  df <- data.frame(x,fx) #Aqui se establece un marco de datos con los datos x y los resultantes de la funcion
  xmax <- sqrt(-2*log(max(fx)*sqrt(2*pi))) #Esta funcion permite encontrar el valor X donde la funcion tiene un valor maximo
  med <- round(mean(x),2) #Calcula la media de los valores dentro de X
  Des <- round(sd(x),3)   #Calcla la desvacion estandar de los valores dentro de X 
  Diag <- {plot(x,fx,type = "l",main = "Distribución normal");segments(0,-1,0,1,col="Red");segments(0,0.03,Des,0.03);#En este comando se almacenan todas la funciones necesarias para la ejecucion
    segments(Des,0.03-0.01,Des,0.03+0.01);segments(0,0.03,-Des,0.03); #del diagrama junto con los comandos para la visualizacion de leyenda y datos de importancia.
    segments(-Des,0.03-0.01,-Des,0.03+0.01);text(Des/2,0.03+0.015,"s");text(-Des/2,0.03+0.015,"s");
    text(med-0.2,0.2,"µ");
    Tx <-paste("Media =",med); Ty <- paste("s =",Des);
    legend("topright",c(Tx,Ty));legend("topleft", expression("f(x)="*frac(1,sqrt(2*pi))*e^frac(-x^2,2)))
  }
  return(list("x"=fx,"Tabla de datos"=df,"X Donde la funcion es máxima"=xmax, "Media"= med,"Desviación éstandar"=Des))  #En esta linea se definen las salidas de la funció
}
f(-3.5,3.5,0.1)  # se ejecuta la funcion cn los parametros ddos por el profesor 

## $x
##  [1] 0.0008726827 0.0012322192 0.0017225689 0.0023840882 0.0032668191
##  [6] 0.0044318484 0.0059525324 0.0079154516 0.0104209348 0.0135829692
## [11] 0.0175283005 0.0223945303 0.0283270377 0.0354745928 0.0439835960
## [16] 0.0539909665 0.0656158148 0.0789501583 0.0940490774 0.1109208347
## [21] 0.1295175957 0.1497274656 0.1713685920 0.1941860550 0.2178521770
## [26] 0.2419707245 0.2660852499 0.2896915528 0.3122539334 0.3332246029
## [31] 0.3520653268 0.3682701403 0.3813878155 0.3910426940 0.3969525475
## [36] 0.3989422804 0.3969525475 0.3910426940 0.3813878155 0.3682701403
## [41] 0.3520653268 0.3332246029 0.3122539334 0.2896915528 0.2660852499
## [46] 0.2419707245 0.2178521770 0.1941860550 0.1713685920 0.1497274656
## [51] 0.1295175957 0.1109208347 0.0940490774 0.0789501583 0.0656158148
## [56] 0.0539909665 0.0439835960 0.0354745928 0.0283270377 0.0223945303
## [61] 0.0175283005 0.0135829692 0.0104209348 0.0079154516 0.0059525324
## [66] 0.0044318484 0.0032668191 0.0023840882 0.0017225689 0.0012322192
## [71] 0.0008726827
## 
## $`Tabla de datos`
##       x           fx
## 1  -3.5 0.0008726827
## 2  -3.4 0.0012322192
## 3  -3.3 0.0017225689
## 4  -3.2 0.0023840882
## 5  -3.1 0.0032668191
## 6  -3.0 0.0044318484
## 7  -2.9 0.0059525324
## 8  -2.8 0.0079154516
## 9  -2.7 0.0104209348
## 10 -2.6 0.0135829692
## 11 -2.5 0.0175283005
## 12 -2.4 0.0223945303
## 13 -2.3 0.0283270377
## 14 -2.2 0.0354745928
## 15 -2.1 0.0439835960
## 16 -2.0 0.0539909665
## 17 -1.9 0.0656158148
## 18 -1.8 0.0789501583
## 19 -1.7 0.0940490774
## 20 -1.6 0.1109208347
## 21 -1.5 0.1295175957
## 22 -1.4 0.1497274656
## 23 -1.3 0.1713685920
## 24 -1.2 0.1941860550
## 25 -1.1 0.2178521770
## 26 -1.0 0.2419707245
## 27 -0.9 0.2660852499
## 28 -0.8 0.2896915528
## 29 -0.7 0.3122539334
## 30 -0.6 0.3332246029
## 31 -0.5 0.3520653268
## 32 -0.4 0.3682701403
## 33 -0.3 0.3813878155
## 34 -0.2 0.3910426940
## 35 -0.1 0.3969525475
## 36  0.0 0.3989422804
## 37  0.1 0.3969525475
## 38  0.2 0.3910426940
## 39  0.3 0.3813878155
## 40  0.4 0.3682701403
## 41  0.5 0.3520653268
## 42  0.6 0.3332246029
## 43  0.7 0.3122539334
## 44  0.8 0.2896915528
## 45  0.9 0.2660852499
## 46  1.0 0.2419707245
## 47  1.1 0.2178521770
## 48  1.2 0.1941860550
## 49  1.3 0.1713685920
## 50  1.4 0.1497274656
## 51  1.5 0.1295175957
## 52  1.6 0.1109208347
## 53  1.7 0.0940490774
## 54  1.8 0.0789501583
## 55  1.9 0.0656158148
## 56  2.0 0.0539909665
## 57  2.1 0.0439835960
## 58  2.2 0.0354745928
## 59  2.3 0.0283270377
## 60  2.4 0.0223945303
## 61  2.5 0.0175283005
## 62  2.6 0.0135829692
## 63  2.7 0.0104209348
## 64  2.8 0.0079154516
## 65  2.9 0.0059525324
## 66  3.0 0.0044318484
## 67  3.1 0.0032668191
## 68  3.2 0.0023840882
## 69  3.3 0.0017225689
## 70  3.4 0.0012322192
## 71  3.5 0.0008726827
## 
## $`X Donde la funcion es máxima`
## [1] 0
## 
## $Media
## [1] 0
## 
## $`Desviación éstandar`
## [1] 2.064
#########################Ejercicio 6. Integral de una funcion de relacion de cambio#########################################
#####PReimero se tiene que indicar que la formula inicial dn/dt = 1.5n se le realizo el sigueinte procedimiento de despeje
# dn/n =1.5 dt -----> integral(dn/dt,limite inferior 30, limite superior x)=integral(1.5 dt, limite inferior=0, limite superior=30)
# se procede a despejar x -----> lnx-ln30=integral(1.5 dt, limite inferior=0, limite superior=30)
# Finalmente se tiene-----> x=exp(ln30+integral(1.5 dt, limite inferior=0, limite superior=30))
# apartir de esta función se realizo la función nota= dado que la población inicial se establece tambien se integra de una vez en la formula, lo demas es variable
library(crayon) #iniciamos instalando al libreria crayon, necesaria para ponerle color al texto de la consola
n.inicial=30  #Definimos la población inicial de insectos
funtion=function(x)(1.5*x^0) #Guardamos la función de crecimiento poblacional
#En la siguiente función se integra primero esta parte de la formula, posteriormente como resultado de despeje d la incognita se construye la ecuación n=exp(ln(población inicial)*integral de la función de numero de indiciduos)
n.final= function(x){
  m=integrate(funtion,0,x)
  pob.final=ceiling(exp(m$value+log(n.inicial)))
  t=paste(red("Cuando t=",x,":","el numero de insectos es de:"),pob.final)
  cat(t)
}
#Inicialmente para esta parte del punto se procede a construir la función
#formula inicial dn/dt = 1.5n se le realizo el sigueinte procedimiento de despeje
# dn/n =1.5 dt -----> integral(dn/dt,limite inferior 30, limite superior x*numero deseado a multiplicar)=integral(1.5 dt, limite inferior=0, limite superior=x)
# despeje------> x=2/3 * integral(dn/dt,limite inferior 30, limite superior x*numero deseado a multiplicar)
#Apartir de este despeje se construyo la función
f.mult=function(x)(1/x)
t.multiplicado= function(x){
  int=integrate(f.mult,n.inicial,(x*n.inicial))
  tiempo=round(((2/3)*int$value),3)
  p=paste("La población aumenta",red(x),"veces respecto a la población inicial cuando t=",red(tiempo))
  cat(p)
}
#Ejecución final de las dos funciones
n.final(4)
## Cuando t= 4 : el numero de insectos es de: 12103
t.multiplicado(2)
## La población aumenta 2 veces respecto a la población inicial cuando t= 0.462
#########################Ejercicio 7. Integral de la funcion normal#########################################
library(crayon)  #libreria necesaria para dar color a las salidas 
Integrando <- function(x)(1/sqrt(2*pi)*exp(2)**(-(x**2)/2)) #Se crea la función de la normal
#Con la función n.probabilidad puedo ingresar los valores de los limites y así encontrar el área bajo la curva que 
#corresponde al valor de probabilidad
n.probabilidad <- function(x,y){
  #Función integrate me permite encontrar el valor de una integral definida donde el primer argumento es la función
  #el segundo limite inferior y el siguiente limite superior
  inte <- integrate(Integrando,lower =x ,upper =y)
  #Con la función cat() y la libreria crayon puedo imprimir texto con color, en este caso se quiere que imprima 
  # "la probabilidad es del X %, donde x sera de color rojo multiplicado por 100 y con dos decimales.
  cat(paste("La probabilidad es del",red(round(inte$value*100,2),"%")))
}
n.probabilidad(-1.96,1.96)
## La probabilidad es del 70.32 %
n.probabilidad(-1,1)
## La probabilidad es del 59.59 %
#######################Ejercicio 8.Cree una función que calcule el coeficiente de variación de un conjunto de datos###
# Se Define el nombre de la funcion y los comandos necesarios para su ejecucion
cv.n <- function(n,med=0,des=0){ #se establecen las variables necesarias para ejecusion de la funcion y sus valores por default
  pH <- sort(rnorm(n,med,des)) # se generan una serie de datos con las variables de la funcion y se organizan de menor a mayor con la funcion sort()
  Med.n <- mean(pH)  # se calcula la media de todos los datos
  Des.n <- sd(pH)    #Se calcula la desviacion estandar de los datos
  cv <- Des.n/Med.n  #Se realiza el caculo de la Coeficinte de variacion de los datos
  Med.n_max <- mean(pH[1:n-1])  #Se calcula la media de todos los datos menos el maximo
  Des.n_max <- sd(pH[1:n-1])    #Se calcula la desviacion estandar de todos los datos menos el maximo
  cv.n_max <- Des.n_max/Med.n_max  #Se calcula la Coeficinte de variacion de todos los datos menos el maximo
  Med.n_min <- mean(pH[2:n]) #Se calcula la media de todos los datos menos el minimo
  Des.n_min <- sd(pH[2:n])  #Se calcula la desviacion de todos los datos menos el minimo
  cv.n_min <- Des.n_min/Med.n_min #Se calcula la Coeficinte de variacion de todos los datos menos el minimo
  Med.n_minmax <- mean(pH[2:n-1]) #Se calcula la media de todos los datos menos el minimo y el maximo
  Des.n_minmax <- sd(pH[2:n-1])   #Se calcula la desviacion de todos los datos menos el minimo y el maximo
  cv.n_minmax <- Des.n_minmax/Med.n_minmax #Se calcula la Coeficinte de variacion de todos los datos menos el minimo y el maximo
  x <- ceiling(n*2.5/100) #se establce el numero de datos que se eleminaran por la acotacion al 5% y se aproxima al entero superior
  Med.n_5 <- mean(pH[1+x:n-x]) #Se calcula la media de todos los datos acotados al 5%
  Des.n_5 <- sd(pH[1+x:n-x])  #Se calcula la desviación de todos los datos acotados al 5%
  cv.n_5 <- Des.n_5/Med.n_5   #Se calcula la Coeficinte de variacion de todos los datos acotados al 5%
  Variaciones <- c("n","n-min","n-max","n-min-max","n-truncado5") # se almacenan los nombres de las columnas en un vector 
  C.variación <- round(c(cv,cv.n_min,cv.n_max, cv.n_minmax,cv.n_5),4) #Se juntan todas los coeficientes de varianza dentro de un solo vector 
  Media_simulada <- round(c( Med.n,Med.n_min, Med.n_max, Med.n_minmax, Med.n_5),2)  #Se juntan todas la varianzas dentro de un solo vector
  Desviación_simulada <- round(c( Des.n, Des.n_min, Med.n_max,Des.n_minmax,Des.n_5),2)  #Se juntan todas la desviaciones dentro de un solo vector
  tablesalida <-data.frame(cbind(Variaciones,C.variación,Media_simulada,Desviación_simulada)) #Se realiza la Tabla con los datos 
  return(tablesalida) # se establece la tabla de los datos como la salida de la funcion 
}
cv.n(50,5.5,0.5) # se ejecuta la función con los datos suministrados por la función
##   Variaciones C.variación Media_simulada Desviación_simulada
## 1           n      0.0929           5.46                0.51
## 2       n-min      0.0872           5.49                0.48
## 3       n-max      0.0894           5.44                5.44
## 4   n-min-max      0.0894           5.44                0.49
## 5 n-truncado5      0.0894           5.44                0.49
############### Ejercicio 9.Temperatura de la atmosfera ###############
#Primero se crea el rango de altitud donde calcularemos la temperatura de la atmosfera.
rango.alti <- c(seq(0,500,100),seq(1000,2000,500),seq(3000,6000,1000),10000,15000)
#Se crea la función t.atmosfera con un argumento correspondiente al valor de altitud (ft).
t.atmosfera <- function(x){
  # tem.table es un vector de la temperatura atmosferica dependiendo la altitud utilizando la función 
  #T=-205.05+(0.00164*altitud), temperatura resultante se expresara en °F y la altitud se debe ingresar en ft
  tem.table <- -205.05+(0.00164*rango.alti)
  #posteriormente se crea el data.frame de la altitud y su correspondente tempertura atmosferica, se asiganan los nombres con names(data)[#]
  tabla <- data.frame(cbind(rango.alti,tem.table))
  names(tabla)[1] <- "Altitud (ft)"
  names(tabla)[2] <- "Tempertura °F"
  #Ahora se crea la función que calculara la temperatura atmosferica dependidndo del valor que ingrese el usuario (x)
  temper <- (-205.05+(0.00164*x))
  #Con el ifelse establecemos que si el valor agregado se se encuentra entre 0 y 15000 ft arrojara la temperatura atmosferica 
  #pero si no esta en este rango generara un mensaje = Valor fuera de rango
  tt <- ifelse(x<0,"Valor fuera de rango",ifelse(x<=15000,temper,"Valor fuera de rango"))
  #Finalmente imprimimos la tabla y el valor de temperatura dependiendo el valor de altitud introducido por el usuario
  return(list(tabla,tt))
}
#NOTA: Los valores a ingresar deben estar en ft y la rspuesta sera en °F
t.atmosfera(2000)
## [[1]]
##    Altitud (ft) Tempertura °F
## 1             0      -205.050
## 2           100      -204.886
## 3           200      -204.722
## 4           300      -204.558
## 5           400      -204.394
## 6           500      -204.230
## 7          1000      -203.410
## 8          1500      -202.590
## 9          2000      -201.770
## 10         3000      -200.130
## 11         4000      -198.490
## 12         5000      -196.850
## 13         6000      -195.210
## 14        10000      -188.650
## 15        15000      -180.450
## 
## [[2]]
## [1] -201.77
###############################Ejercicio 10. HUmedad del suelo############################
#Se establecen las variables necesarias par la función:
#MCSH: Masa de capsula con suelo húmedo
#MCSS: Masa de capsula con suelo seco
#MCV: Masa de capsula vacio
#Dend.a: Densidad aparente del suelo

HVyg <- function(MCSH,MCSS,MCV,Dend.a){
  agua <- MCSH-MCSS           #Calculo del la masa de agua en suelo
  soil.s <- MCSS-MCV          #Calculo del la masa de suelo seco
  Hg <- round((agua/soil.s)*100,1)   #Humedad Gravimetrica
  Hv <- round(Hg*Dend.a,1)           #Humedad volumetrica
  df <- rbind(Hg,Hv)
  #Con el condicional se definen la salidas de la funcion dependiendo de si se esta ingresando los datos 
  #correspondientes a una muestra o a n número de muestras por medio de vectores.
  ifelse(length(Hv)==1,return(list("Humedad Volumetrica"=Hv, "Humedad Gravimetrica"=Hg)), #Si el resutaldo de la prueba es verdadero se mostraran las humedades en consola 
         Diag <- barplot(df, main = "Humedad volumetrica y Humedad gravimetrica", col = c("lightblue","darkblue"), #Si el resultado de la prueba es falso, se mostrara una figura donde se
                         names.arg = c(1:length(Hv)),beside = T, xlab = "Número de Muestras",                     # se grafican los valores de humedad de las dstintas muestras.
                         legend = c("Humedad volumetrica (cm^3/g)","Humedad Gravimetrica (%)"),cex.names = 0.7))
}
#Datos correspondientes a un grupo de muestras.
MCV <- c(13.22,12.27,16.81,13.70,10.70,15.13,17.38,16.17,13.41,            
         11.18,16.91,16.40,14.99,14.16,11.98,13.30,15.90,13.60,11.30,
         13.46,16.06,11.51,15.10)
MCSH <- c(37.52,37.45,60.84,38.50,35.50,43.40,45.18,38.10,37.09,37.71,     
          46.24,43.99,49.66,39.16,37.51,40.50,40.80,38.60,36.30,27.12,34.43,36.62,40.10)
MCSS <- c(31.74,31.27,49.08,32.10,28.62,34.48,37.17,31.98,31.15,31.22,
          37.60,35.67,40.23,27.87,28.04,27.11,31.61,28.25,29.40,22.18,30.09,29.02,29.47)
HVyg(MCSH,MCSS,MCV,1.65)  #ejecucion de la fucnion con los datos de las muestras.

## [1] 1.5
#Ejecucion de la funcion con los datos de una sola muestra
HVyg(180.45,147.62,30,1.2)
## $`Humedad Volumetrica`
## [1] 33.5
## 
## $`Humedad Gravimetrica`
## [1] 27.9
############################ 11. Resistencia total de resistores conectados en paralelelo######
#El objetivo de rest.3 función para encontar el valor de resistencia total con la ecuación Rt= 1/(1/r1 + 1/r2 + 1/r3)
#rest.3 requiere de 3 argumentos que son los valores de resistencia individual de cada resistor
rest.3 <- function(x,y,z){
  R1 <- 1/x
  R2 <- 1/y
  R3 <- 1/z
  Rt <- round((1/(R1+R2+R3)),2)
  paste("La resistencia total es de ",Rt,"ohms")
}
#Nota: valores ingresados en ohms
rest.3(100,200,150)
## [1] "La resistencia total es de  46.15 ohms"
#LA función rest.n me generara la resistencia cuando tenemos numero indefinido de transitores, x, se introduce como un vector
rest.n <- function(x){
  #Con la función for obtendremos el valor del denominador donde cada ciclo se va sumando siempre y cuando n diferente de 0 
  #ya que saldria error el resultado 1/n , el vector resultante se guarda en s, que posteriormente dividira a 1 y tendremos el valor de
  #resistencia total
  s=0 
  for (n in x) 
    if(n!= 0) s<-(1/n)+s
    
    hh=round((1/s),2)
    paste("La resistencia total es de ",hh,"ohms")
}
#primero creamos un vector con los valores de resistencia, no importa cuantos sean
restunit <- c(500,200,100,200,100)
#Luego se introducen en la función rest.n para obtener el valor de resistencia total
rest.n(restunit)
## [1] "La resistencia total es de  31.25 ohms"
#Grafico de 1 a 30 resitores, suponiendo valores de resistencia de 200 ohms
N.reistores <- seq(1,30,1)
R.total <- 200/N.reistores
rt=cbind(N.reistores,R.total)
plot(rt,type = "l", xlab = "N° de resistores",ylab = "Resistencia total (ohms)",main = "Relación de transistores con \n la resitencia total",col="red")

###########################################################################



###############################12. Ultimo ejercicio##########################################
library(plotly) #Se llama la libreria necesaria para la ejecucion de un grafico en coordenadas polares 
## Loading required package: ggplot2
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:crayon':
## 
##     %+%
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:crayon':
## 
##     style
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
Polar.cnv <- function(x,y){ # se definen las variables donde "x" y "y" son las variables que almacenan los valores coorespondientes a las coordenadas en el eje x y y
  thetpi <- atan(y/x)        # se realiza el calculo del angulo con respecto al eje x
  thet <- thetpi*180/pi      # Se realiza la conversion de los angulos obtenidos anteriormente de pi radianes a grados 
  ratio <- sqrt(x**2+y**2)       # se ejecuta el calculo de la distancia de punto con respecto al origen del plano
  thet[which(x<0&y>0)] <- 180+thet[which((x<0)&(y>0))] #Which es una funcion la cual devuelve los valores correspondientes a las posiciones de un valor con una condicion dada  
  thet[which(x<0&y<0)] <- 180+thet[which((x<0)&(y<0))] #dentro de un vector especifico, por lo tanto permite definir la posisicion dentro de otro vector y realizar modificaciones en 
  thet[which(x>0&y<0)] <- 360+thet[which((x>0)&(y<0))] #En este caso se realiza el ajuste de los angulos de los vectores que estan ubicados dentro del los cuadrantes II,III y IV
  Diag <-plot_ly(                     #se almacena el diagrama dento de una variable  
    type = 'scatterpolar',           #Se define el tipo de diagrama, en este caso se llama a un diagarama de dispersición polar, 
    r = ratio,                       #Se definen los dos parametros correspondientes a las coordenadas polares el radio y el angulo del punto 
    theta = thet,
    mode='markers'                   # Se establece el tipo de diagrama, en este caso se define cmo un diagrama polar de puntos  
  )
  return(list(Diag,data.frame(x,y,"Radianes"=thetpi,"Grados"=thet,"Radio"=ratio))) #Se establecen los resultados que devueve la fución
}

A <- c(6,6,-6,-6,3,3,3,-3,-3)       #Se ingresan los valores correspondientes a las coordenadas del eje X
B <- c(6,-6,6,-6,-1,0,1,1,-1)       #Se ingresan los valores correspondientes a las coordenadas del eje y

Polar.cnv(A,B)                      #Se ejecutó la funcion con los vectores de las coordenadas;
## [[1]]
## 
## [[2]]
##    x  y   Radianes    Grados    Radio
## 1  6  6  0.7853982  45.00000 8.485281
## 2  6 -6 -0.7853982 315.00000 8.485281
## 3 -6  6 -0.7853982 135.00000 8.485281
## 4 -6 -6  0.7853982 225.00000 8.485281
## 5  3 -1 -0.3217506 341.56505 3.162278
## 6  3  0  0.0000000   0.00000 3.000000
## 7  3  1  0.3217506  18.43495 3.162278
## 8 -3  1 -0.3217506 161.56505 3.162278
## 9 -3 -1  0.3217506 198.43495 3.162278
#Para la visualizacion del diagrama de dispersion polar visitar http://rpubs.com/juldgomezbal/414868