/
lesson.yaml
235 lines (183 loc) · 16.1 KB
/
lesson.yaml
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
- Class: meta
Course: Programando en R
Lesson: Funciones
Author: Sean Kross
Type: Standard
Organization: swirlstats
Version: 2.2.14
- Class: text
Output: Las funciones son uno de los conceptos básicos fundamentales del lenguaje R. Ellas son pequeños piezas de código reutilizable que pueden ser tratados como cualquier otro objeto de R.
- Class: text
Output: "Si usted ha trabajado en de cualquier otro componente de este curso, entonces seguramente a utilizado algunas funciones ya. Las funciones se caracterizan generalmente por estar compuestas por el nombre de la función seguido de paréntesis."
- Class: cmd_question
Output: "Vamos a intentar usar algunas funciones básicas sólo por diversión. La función Sys.Date() devuelve una cadena que representa la fecha de hoy. Escriba Sys.Date() abajo para ver qué pasa."
CorrectAnswer: Sys.Date()
AnswerTests: omnitest(correctExpr='Sys.Date()')
Hint: "Depliega la fecha de hoy escribiendo: Sys.Date()"
- Class: text
Output: "La mayoría de las funciones en materia de R devuelven un valor. Funciones como Sys.Date() devuelven un valor basado en el ambiente de su computador, mientras que otras funciones manipulan datos de entrada con el fin de calcular un valor de retorno."
- Class: cmd_question
Output: "La función mean() toma un vector de números como entrada, y devuelve la media de todos los números del vector de entrada. Las entradas a las funciones son a menudo llamados argumentos. Proporcionar argumentos a una función a veces es llamado también el pase de argumentos a esa función. Los argumentos que se quieren pasar a una función deben ir dentro de los paréntesis de la función. Trate de pasar el argumento c(2, 4, 5) a la función mean()."
CorrectAnswer: mean(c(2, 4, 5))
AnswerTests: omnitest(correctExpr='mean(c(2, 4, 5))')
Hint: "Calcule el promedio de 2, 4 y 5 escribiendo: mean(c(2, 4, 5))"
- Class: text
Output: Las funciones suelen tener argumentos que son variables sobre los que la misma operará. Por ejemplo, la función mean() recibe un vector como argumento, como por ejemplo mean(c(2,6,8)). La función mean() a continuación suma todos los números en el vector y divide esta suma por el longitud del vector.
- Class: text
Output: En la siguiente pregunta se le pedirá que modifique un script, que aparecerá tan pronto como usted se mueva a dicha pregunta. Cuando haya terminado de modificarlo, guarde los cambios en el script y escriba submit() en la consola, esto hará que el script sea evaluado. Incluiremos algunos comentarios en el script que se abrirá, así que asegúrese de leerlos!
- Class: script
Output: La última expresión de R a ser evaluada en una función se convertirá en el valor que esa función devolverá. Queremos que esta función tome un argumento x, y devuelva x sin modificaciones. Elimine el símbolo de numeral de manera que x sea devuelto sin ninguna modificación. Asegúrese de guardar sus cambios antes de escribir submit().
AnswerTests: test_func1()
Hint: Asegúrese de eliminar el símbolo de numeral por lo que la última expresión en la función es x.
Script: boring_function.R
- Class: cmd_question
Output: "Ahora que ha creado su primera función, vamos a probarla! Escriba: boring_function('Mi primera función!'). Si su función trabaja, ella simplemente debería devolver la cadena: 'Mi primera función!'"
CorrectAnswer: "boring_function('Mi primera función!')"
AnswerTests: omnitest(correctExpr="boring_function('Mi primera función!')")
Hint: "Probemos boring_function escribiendo: boring_function('Mi primera función!')"
- Class: text
Output: "Felicitaciones por la escritura de su primera función. Escribiendo funciones, usted podrá obtener una seria una idea de cómo trabaja R. Como dijo una vez John Chambers, el creador de R: \n \n Para entender la computación en R, son útiles dos consignas: \n \n 1. Todo lo que existe es un objeto. \n \n 2. Todo lo que sucede es una llamada a una función."
- Class: cmd_question
Output: "Si quieres ver el código fuente de cualquier función, simplemente escriba el nombre de la función sin argumentos o paréntesis. Vamos a tratar de hacer esto esto con la función que acaba de crear. Escriba: boring_function para ver su código fuente."
CorrectAnswer: boring_function
AnswerTests: omnitest(correctExpr='boring_function')
Hint: "Para ver el código fuente de boring_function sólo tienes que escribir: boring_function"
- Class: text
Output: "Es hora de hacer una función más útil. Vamos a replicar el funcionalidad de la función mean() mediante la creación de una función llamada: my_mean(). Recuerde que para calcular el promedio de todos los números en un vector, usted tiene que calcular la suma de todos los números del vector, y luego dividir esa suma por la cantidad de números que hay en el vector."
- Class: script
Output: Asegúrese de guardar el script antes de escribir submit().
AnswerTests: test_func2()
Hint: "Use la función sum() para encontrar la suma de todos los números en el vector. Utilice la función length() para obtener el tamaño del vector."
Script: my_mean.R
- Class: cmd_question
Output: "Ahora pruebe su función my_mean() para el calculo de la media del vector c(4, 5, 10)."
CorrectAnswer: my_mean(c(4, 5, 10))
AnswerTests: omnitest(correctExpr='my_mean(c(4, 5, 10))')
Hint: "Ejecute el comando y_mean(c(4, 5, 10)) para probar su nueva función."
- Class: text
Output: "A continuación, vamos a tratar de escribir una función con argumentos predeterminados. Podemos configurar valores predeterminados para los argumentos de una función, esto puede ser útil si usted piensa que cualquiera que utilize su función establecerá un determinado argumento con el mismo valor la mayoría de las veces."
- Class: script
Output: Asegúrese de guardar el script antes de escribir submit().
AnswerTests: test_func3()
Hint: "Recuerda establecer los valores predeterminados apropiados!"
Script: remainder.R
- Class: cmd_question
Output: "Vamos a hacer algunas pruebas de la función remainder(). Ejecute remainder(5) para ver qué pasa."
CorrectAnswer: remainder(5)
AnswerTests: omnitest(correctExpr='remainder(5)')
Hint: "Vamos a probar la función remainder ejecutando: remainder(5)"
- Class: text
Output: "Tomemos un momento para examinar lo que acaba de suceder. Usted proporciono un solo argumento de la función, y R lo adjudico a la variable 'num', dado que 'num' es el primer argumento. El valor predeterminado para 'divisor' es 2, por lo que la función utiliza el valor por defecto que ya usted ha proporcionado."
- Class: cmd_question
Output: "Ahora vamos a probar la función remainder proporcionando dos argumentos. Escriba: remainder(11, 5) y vamos a ver qué pasa."
CorrectAnswer: remainder(11, 5)
AnswerTests: omnitest(correctExpr='remainder(11, 5)')
Hint: "Vamos a probar la función de su remainder ejecutando: remainder(11, 5)."
- Class: text
Output: "Una vez más, los argumentos se han emparejado apropiadamente."
- Class: cmd_question
Output: "También puede especificar explícitamente los argumentos en una función. Cuando usted designa explícitamente los valores de los argumentos por su nombre, el orden de los argumentos deja de tener importancia. Puede probar esto escribiendo: remainder(divisor = 11, num = 5)."
CorrectAnswer: remainder(divisor = 11, num = 5)
AnswerTests: omnitest(correctExpr='remainder(divisor = 11, num = 5)')
Hint: "El orden ya no importa cuando proporcionamos explícitamente valores de los argumentos con su nombre! Pruebalo escribiendo: remainder(divisor = 11, num = 5)"
- Class: text
Output: "Como se puede ver, hay una diferencia significativa entre remainder(11, 5) y remainder(divisor = 11, num = 5)"
- Class: cmd_question
Output: "R también puede hacer coincidir argumentos parcialmente. Pruebe escribiendo remainder(4, div = 2) para ver esta propiedad en acción."
CorrectAnswer: remainder(4, div = 2)
AnswerTests: omnitest(correctExpr='remainder(4, div = 2)')
Hint: "Pon a prueba la concordancia parcial escribiendo: remainder(4, div = 2)"
- Class: text
Output: "Una palabra de advertencia: en general queremos hacer nuestro código tan fácil de entender como sea posible. Cambiar el orden de los argumentos mediante la especificación de sus nombres o sólo con nombres de argumentos parciales puede ser confuso, por lo que debemos utilizar estas propiedades con cuidado!"
- Class: cmd_question
Output: "Con toda esta charla sobre argumentos, usted puede preguntarse si hay es una manera que usted pueda ver los argumentos de una función (además de buscar en la documentación). Afortunadamente, puede utilizar la función args()! Escriba: args(remainder) para examinar los argumentos de la función que remainder."
CorrectAnswer: args(remainder)
AnswerTests: omnitest(correctExpr='args(remainder)')
Hint: "Mira a los argumentos de la función remainder() escribiendo: args(remainder) "
- Class: text
Output: "Es posible que no se haya dado cuenta, pero le acabo instruir para hacer algo ¡bastante interesante! args() es una función, remainder() es una función, sin embargo, remainder() era un argumento para args(). Sí, es verdad: se pueden pasar funciones como argumentos! Este es un concepto muy poderoso. Vamos a escribir un codigo para ver cómo funciona esto."
- Class: script
Output: Asegúrese de guardar el script antes de escribir submit().
AnswerTests: test_func4()
Hint: "Asegúrese de que cuando se pasa una función como un argumento, que se pase el nombre de la función sin paréntesis!"
Script: evaluate.R
- Class: cmd_question
Output: "Vamos a tomar su nueva función de evaluate() para dar una vuelta! Utilice evaluate para encontrar la desviación estándar del vector c(1.4, 3.6, 7.9, 8.8)."
CorrectAnswer: evaluate(sd, c(1.4, 3.6, 7.9, 8.8))
AnswerTests: omnitest(correctExpr='evaluate(sd, c(1.4, 3.6, 7.9, 8.8))')
Hint: "La función de la desviación estándar se llama sd() Asegúrese de que cuando se pase una función como un argumento que se pase el nombre de la función sin paréntesis!"
- Class: text
Output: "La idea de pasar funciones como argumentos a otras funciones es un concepto importante y fundamental en la programación."
- Class: text
Output: "Es posible que se sorprenda al saber que usted puede pasar una función como argumento sin haber definido primero la función que será pasada. Funciones que no tienen nombre que se conocen apropiadamente como funciones anónimas."
- Class: text
Output: "Vamos a usar la función de evaluate() para explorar cómo trabajan las funciones anónimas. Para el primer argumento de la función de evaluate() vamos a escribir una pequeña función que cabe en una sola línea. En el segundo argumento pasaremos algunos datos requeridos por la pequeña función anónima del primer argumento."
- Class: cmd_question
Output: "Escriba el siguiente comando y a continuación vamos a discutir cómo funciona: evaluate(function(x){x+1}, 6) "
CorrectAnswer: evaluate(function(x){x+1}, 6)
AnswerTests: omnitest(correctExpr='evaluate(function(x){x+1}, 6)')
Hint: "Sólo tienes que escribir el comando evaluate(function(x){x+1}, 6)"
- Class: text
Output: "El primer argumento es una pequeña función anónima que toma un argumento `x` y devuelve `x + 1`. Le pasamos el número 6 a esta función por lo que la totalidad de la expresión se evalúa en 7."
- Class: cmd_question
Output: "Trate de usar evaluate() junto con una función anónima para devolver el primer elemento del vector c(8, 4, 0). Su función anónima sólo debe tener un argumento que debería ser una variable `x`."
CorrectAnswer: evaluate(function(x){x[1]}, c(8, 4, 0))
AnswerTests: omnitest(correctExpr='evaluate(function(x){x[1]}, c(8, 4, 0))')
Hint: "Puede que tenga que recordar la forma de indexar los elementos de un vector. Recuerde que su función anónima sólo debe tener un argumento, y ese argumento debería ser nombrado `x`."
- Class: cmd_question
Output: "Ahora trate de usar evaluate() junto con una función anónima para devolver el último elemento del vector c(8, 4, 0). Su función anónima sólo debe tener un argumento que debería ser la variable `x`."
CorrectAnswer: evaluate(function(x){x[length(x)]}, c(8, 4, 0))
AnswerTests: omnitest(correctExpr='evaluate(function(x){x[length(x)]}, c(8, 4, 0))')
Hint: "Puede que tenga que recordar la forma de indexar los elementos de un vector. Recuerde que su función anónima sólo debe tener un argumento, y ese argumento debería ser nombrado `x`. El uso de la función length() en su función anónima puede ayudarte."
- Class: cmd_question
Output: "Para el resto del curso vamos a utilizar con frecuencia la función paste(). Escriba ?paste para que podamos echar un vistazo a la documentación de la función."
CorrectAnswer: ?paste
AnswerTests: omnitest(correctExpr='?paste')
Hint: "Solo escribe: ?paste"
- Class: text
Output: "Como se puede ver el primer argumento de paste() es `...` lo cual hace referencia a una elipsis o simplemente punto-punto-punto. Los puntos suspensivos permiten que un número indefinido de argumentos pueda ser pasado a una función. En el caso de la función paste() cualquier número de cadenas de caracteres se pueden pasar como argumentos y paste() las devolverá todas concatenadas en una sola cadena."
- Class: cmd_question
Output: 'Sólo para ver cómo funciona paste(), escriba paste("La", "programación", "es", "divertida!")'
CorrectAnswer: paste("La", "programación", "es", "divertida!")
AnswerTests: omnitest(correctExpr='paste("La", "programación", "es", "divertida!")')
Hint: 'Solo escriba: paste("La", "programación", "es", "divertida!")'
- Class: text
Output: "Es hora de escribir nuestra propia versión modificada de paste()."
- Class: script
Output: Asegúrese de guardar el script antes de escribir submit().
AnswerTests: test_func5()
Hint: "Recuerde que los argumentos pueden venir después ..."
Script: telegram.R
- Class: cmd_question
Output: "Ahora vamos a probar la función telegram. Utilice su nueva función telegram pasandole los argumentos que quieras! "
CorrectAnswer: telegram()
AnswerTests: expr_uses_func('telegram')
Hint: 'Use la función telegrama con cualquier argumento que desee utilizar.'
- Class: script
Output: Asegúrese de guardar el script antes de escribir submit().
AnswerTests: test_func6()
Hint: "Su función debe tener tres secciones: capture la elipsis en una list(), desempaquete los argumentos de la elipsis y asignelos a variables, a continuación pase esas variables a paste()."
Script: mad_libs.R
- Class: cmd_question
Output: "Es hora de utilizar su función mad_libs. Asegúrese de nombrar los argumentos lugar, adjetivo y sustantivo para que su función sea operativa."
CorrectAnswer: mad_libs(adjectivo = "", lugar = "", sustantivo = "")
AnswerTests: expr_uses_func('mad_libs')
Hint: 'Use la función mad_libs y asegúrese de nombrarlos argumentos lugar, adjetivo, y sustantivo.'
- Class: text
Output: "Estamos llegando al final de esta lección, pero todavía hay una idea más de la que debemos estar conscientes."
- Class: text
Output: "Usted está familiarizado con la suma, resta, multiplicación y divición de números en R. Para ello utilizan los símbolos +, -, *, y /. Estos símbolos se llaman operadores binarios porque toman dos entradas, una entrada a la izquierda y una entrada por la derecha."
- Class: text
Output: "En R usted puede definir sus propios operadores binarios. En el siguiente secuencia de comandos le voy a mostrar cómo."
- Class: script
Output: Asegúrese de guardar el script antes de escribir submit().
AnswerTests: test_func7()
Hint: "Recuerde: 'Hello' %p% 'student!' es cómo se utiliza el operador binario."
Script: bin_op.R
- Class: cmd_question
Output: "Usted hizo su propio operador binario! Vamos a probarlo. Pegue juntas estas cadenas de texto: 'Yo', 'amo', 'R!' utilizando su nuevo operador binario."
CorrectAnswer: "'Yo' %p% 'amo' %p% 'R!'"
AnswerTests: omnitest(correctExpr="'Yo' %p% 'amo' %p% 'R!'")
Hint: 'Use %p% entre cada cadena.'
- Class: text
Output: "Hemos llegado al final de nuestra lección! Vaya por ahí y escriba algunas funciones estupendas!"