-
Notifications
You must be signed in to change notification settings - Fork 12
/
19-functions.Rmd
239 lines (152 loc) · 5.98 KB
/
19-functions.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
# Funciones
```{r, include = FALSE}
library(tidyverse)
library(datos)
```
## 19.2 ¿Cuándo deberías escribir una función?{-#escribir-funcion}
### 19.2.1 Ejercicios{-#ejercicios-1921}
1. ¿Por qué `TRUE` no es un parámetro para `rescale01()`? ¿Qué pasaría si `x` está contenido en un valor único perdido y `na.rm` fuese `FALSE`?
<div class="solucion">
<h3>Solución</h3>
</div>
2. En la segunda variante de `rescale01()`, los valores infinitos se dejan sin cambio. Reescribe `rescale01()` así `-Inf` is convertido a 0, y `Inf` es convertido a 1.
<div class="solucion">
<h3>Solución</h3>
</div>
3. Practica convertir los siguientes fragmentos de código en funciones. Piensa en lo que hace cada función. ¿Cómo lo llamarías? ¿Cuántos argumentos necesita? ¿Puedes reescribirlo para ser más expresivo o menos duplicado?
```{r, eval = FALSE}
mean(is.na(x))
x / sum(x, na.rm = TRUE)
sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE)
```
<div class="solucion">
<h3>Solución</h3>
</div>
4. Escribe tus propias funciones para computar la variancia y la inclinación de un vector numérico. La varianza se define como
$$
\mathrm{Var}(x) = \frac{1}{n - 1} \sum_{i=1}^n (x_i - \bar{x}) ^2 \text{,}
$$
donde $\bar{x} = (\sum_i^n x_i) / n$ es la media de la muestra.
La inclinación se define como
$$
\mathrm{Skew}(x) = \frac{\frac{1}{n-2}\left(\sum_{i=1}^n(x_i - \bar x)^3\right)}{\mathrm{Var}(x)^{3/2}} \text{.}
$$
<div class="solucion">
<h3>Solución</h3>
</div>
5. Escribe `both_na()`, una función que toma dos vectores de la misma longitud y retorna el número de posiciones que tiene `NA` en ambos vectores.
<div class="solucion">
<h3>Solución</h3>
</div>
6. ¿Qué hacen las siguientes funciones? ¿Por qué son tan útiles aún cuando son tan cortas?
```{r}
is_directory <- function(x) file.info(x)$isdir
is_readable <- function(x) file.access(x, 4) == 0
```
<div class="solucion">
<h3>Solución</h3>
</div>
7. Lee el [complete lyrics](https://en.wikipedia.org/wiki/Little_Bunny_Foo_Foo)
de "Pequeño conejito Foo Foo". Como ves, hay mucha duplicación en la letra de la canción. Extiende el ejemplo inicial de pipes para recrear la canción completa, usar las funciones para reducir la duplicación.
<div class="solucion">
<h3>Solución</h3>
</div>
## 19.3 Las funciones son para los humanos y las computadoras{-#funciones-humanos}
### 19.3.1 Ejercicios{-#ejercicios-1931}
1. Lee el código fuente para cada una de las siguientes tres funciones, interpreta que hacen, y luego propone nombres mejores.
```{r}
f1 <- function(string, prefix) {
substr(string, 1, nchar(prefix)) == prefix
}
f2 <- function(x) {
if (length(x) <= 1) return(NULL)
x[-length(x)]
}
f3 <- function(x, y) {
rep(y, length.out = length(x))
}
```
<div class="solucion">
<h3>Solución</h3>
</div>
2. Toma una función que hayas escrito recientemente y tómate 5 minutos para pensar un mejor nombre para la función y para sus argumentos.
<div class="solucion">
<h3>Solución</h3>
</div>
3. Compara y contrasta `rnorm()` y `MASS::mvrnorm()`. ¿Cómo podrías hacerlas más consistentes?
<div class="solucion">
<h3>Solución</h3>
</div>
4. Argumenta porqué `norm_r()`,`norm_d()` etc sería una mejor opción que `rnorm()`, `dnorm()`. Argumenta lo contrario.
<div class="solucion">
<h3>Solución</h3>
</div>
## 19.4 Ejecución condicional{-#ejecucion-condicional}
### 19.4.4 Ejercicios{-#ejercicios-1944}
1. ¿Cuál es la diferencia entre `if` and `ifelse()`? Lee cuidadosamente la ayuda y construye tres ejemplos que ilustren las diferencias claves.
<div class="solucion">
<h3>Solución</h3>
</div>
2. Escribe una función de saludo que diga "buenos días", "buenas tardes" o "buenas noches", según la hora del día. (Sugerencia: usa un argumento de tiempo que por defecto es `lubridate::now()`, eso hará que sea más fácil testear tu función).
<div class="solucion">
<h3>Solución</h3>
</div>
3. Implementa una función `fizzbuzz` que tenga un solo número como input. Si el número es divisible por tres, devuelve "fizz". Si es divisible por cinco, devuelve "buzz". Si es divisible por tres y cinco, devuelve "fizzbuzz". De lo contrario, devuelve el número. Asegúrate de escribir primero código que funciones antes de crear la función.
<div class="solucion">
<h3>Solución</h3>
</div>
4. ¿Cómo podrías usar `cut()` para simplificar este conjunto de sentencias if-else anidada?
```{r, eval = FALSE}
if (temp <= 0) {
"congelado"
} else if (temp <= 10) {
"helado"
} else if (temp <= 20) {
"fresco"
} else if (temp <= 30) {
"tibio"
} else {
"caluroso"
}
```
¿Cómo cambiarías la sentencia a `cut()` si hubieras usado `<`en lugar de `<=`? ¿Cuál es la otra ventaja principal de `cut()` para este problema? (Sugerencia: ¿qué sucede si tienes muchos valores en `temp`?)
<div class="solucion">
<h3>Solución</h3>
</div>
5. ¿Qué sucede si usaras `switch()` con un valor numérico?
<div class="solucion">
<h3>Solución</h3>
</div>
6. ¿Qué hace la llamada a `switch()`? ¿Qúe sucede si `x` fuera “e”?
```{r, eval = FALSE}
switch(x,
a = ,
b = "ab",
c = ,
d = "cd"
)
```
Experimenta, luego lea cuidadosamente la documentación.
<div class="solucion">
<h3>Solución</h3>
</div>
## 19.5 Argumentos de funciones{-#argumentos-funciones}
### 19.5.5 Ejercicios{-#ejercicios-1955}
1. ¿Qué realiza `commas(letters, collapse = "-")`? ¿Por qué?
<div class="solucion">
<h3>Solución</h3>
</div>
2. Sería bueno si se pudiera suplantar múltiples caracteres al argumento `pad`,
ej., `rule("Title", pad = "-+")`. ¿Por qué esto actualmente no funciona? ¿Cómo podrías solucionarlo?
<div class="solucion">
<h3>Solución</h3>
</div>
3. ¿Qué realiza el argumento `trim` a la función `mean()`? ¿Cuándo podrías utilizarla?
<div class="solucion">
<h3>Solución</h3>
</div>
4. El valor de defecto para el argumento `method` a `cor()` es
`c("pearson", "kendall", "spearman")`. ¿Qué significa esto? ¿Qué valor se utiliza por defecto?
<div class="solucion">
<h3>Solución</h3>
</div>