
PROGRAMAFICIÓN
R-suelve tus dudas
PRÁCTICA 5:
Bucles while, funciones y representación gráfica en R
EJERCICIO 1
*Para entender mejor el objetivo de la práctica ver el vídeo


En este primer paso creamos la función que reparte los escaños

Introducimos datos


Elaboración de los gráficos
SOLUCIÓN:
Parte 1:
# Comenzamos nombrando la función:
asignacion_escaños<-function(votos,npart,nesc) {
# todo lo que viene a continuación es nuestra función:
# Ponemos los contadores a 1
k=1
cuenta_escan=1
# Creamos la matriz A, que será nuestra tabla de votos a cada partido
A=matrix(c(0),nrow=npart, ncol=nesc)
# ponemos el vector escaños_unica a 0, que indica que inicialmente cada partido tiene 0 escaños
escaños_unica=0
for (i in 1:npart){
escaños_unica[i]=0 }
# iniciamos proceso de reparto de escaños con un bucle while, que dura hasta que todos los escaños se han repartido. Dentro de ese bucle while comparamos todos los valores de la matriz A, y el máximo lo almacenamos, le sumamos un escaño a su partido, y convertimos ese valor a 0, para no ser vuelto a usar. Al final sumamos 1 a las columnas (k) y a el escaño a repartir (cuenta_scan)
while(cuenta_escan<=nesc){
for(i in 1:npart){
A[i,k]=votos[i]/k
}
max=A[1,1]
imax=1
jmax=1
for (i in 1:npart){
for (j in 1:k){
if(A[i,j]>=max){
max=A[i,j]
imax=i
jmax=j
}
}
}
A[imax,jmax]=0
escaños_unica[imax]=escaños_unica[imax]+1
k=k+1
cuenta_escan=cuenta_escan+1
}
# Llamamos a la función, que nos dará como valor de salido escaños_unica, un vector con el número de escaños de cada partido:
return(escaños_unica)
}
# la función se cierra, y ya está terminada
Parte 2:
# Ahora, usamos la función metiendo datos:
↓↓Este código nos lo proporciona el profesor en el guión para realizar mejor la práctica↓↓
#datos para la función#
nesc=350; npart=17
votos=c(6752983, 5019869, 3640063, 3097185, 1637540, 869934, 577055, 527375, 377423, 276519, 244754, 226469, 123981, 119597, 98448, 68580, 19696)
Partido=c('PSOE','PP','VOX','PODEMOS','Cs','ERC','MasPais','JxCAT','PNV','BILDU', 'CUP','PACMA', 'CC', 'BNG', 'NAVARRA_SUMA','PRC','TeruelExiste');
escaños_reales=c(120, 89, 52, 35, 10, 13, 8, 8, 6, 5, 2, 0, 2, 1, 2, 1, 1);
Para el programa principal:
#le damos un nombre a la función que hemos creado y construimos la tabla#
escañitos=asignacion_escaños(votos,npart,nesc)
T=data.frame (Partido, escañitos, escaños_reales)
T
También se piden dos gráficos de distintos diseños:
#Ordenar los gráficos distribuidos en 2 filas y 1 columna#
par(mfrow=c(2,1),mar=c(5,4,0.01,1))
#Primer gráfico: sectores circulares#
names(escañitos)=c('PSOE','PP','VOX','PODEMOS','Cs','ERC','MasPais')
pie(escañitos,clockwise=TRUE,col=c('red','blue','green','purple','orange','yellow','pink','red','dark green','blue','brown'), cex=0.8)
#Segundo gráfico: barras superpuestas#
names(escaños_reales)=c('PSOE','PP','VOX','PODEMOS','Cs','ERC','MasPais','JxCAT','PNV','BILDU', 'CUP','PACMA', 'CC', 'BNG', 'NAVARRA_SUMA','PRC','TeruelExiste')
escaños=rbind(escaños_reales, escañitos)
barplot(escaños,beside=TRUE,col=c(4,5),las=2)
legend(x='top',rownames(escaños),col=1:17,fill=c(4,5))
NOTA: para que las barras sean horizontales se pondría: horiz=1, las=1 (horiz gira las barras y las gira los nombres).

¡¡CUIDADO!!
ERRORES COMUNES:
- Llamar a una variable un nombre con o sin minúscula, de forma que es un nombre diferente
- while se escribe con minúscula
- Llaves no cerradas de los bucles
- Confundir el <= con >=, de manera que el ejercicio sale al revés
- Llamar a la función fuera de la llave del final, se pone antes.
Explicación en vídeo:
Para más información se puede acceder al repositorio a través del enlace