Menu
CoddyTech

Trabajar con archivos

Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 1 de 57.

Los programas reales se dividen en varios archivos. En R, source("Greeting.R") ejecuta otro archivo de principio a fin, y todas las funciones que define ese archivo están disponibles después:

# Greeting.R
greeting <- function(name) {
  paste0("Hello, ", name, "!")
}

# main.R
source("Greeting.R")
cat(greeting("Ada"), "\n")

Al ejecutar main.R, se imprime Hello, Ada!: la línea source() carga greeting() antes de que main.R la llame.

El programa comienza en el archivo que ejecutas, aquí main.R, y R lo lee línea por línea. El orden importa: una función solo existe después de que se haya cargado el archivo que la define, así que las líneas source() van al principio:

# main.R
cat(greeting("Ada"), "\n")   # Error: no se pudo encontrar la función "greeting"
source("Greeting.R")
cat(greeting("Ada"), "\n")   # funciona: greeting() ya existe

La disposición habitual es una clase por archivo, cuyo nombre coincide con el de la clase: Account.R contiene el constructor account y sus métodos, Shape.R contiene los genéricos shape. En los desafíos de esta sección, tu código va en esos archivos, y main.R contiene el código de entrada/salida proporcionado, con las líneas source() ya en la parte superior, en el orden correcto. El editor muestra cada archivo como una pestaña.

Shape.R      # funciones genéricas compartidas por todas las figuras: cárgalo primero con source
Circle.R     # la clase circle y sus métodos
main.R       # source("Shape.R"); source("Circle.R"); lee la entrada e imprime los resultados

source() ejecuta un archivo en el entorno global, por lo que sus funciones y variables se convierten en nombres globales. R no tiene nombres privados de archivo: si dos archivos definen helper(), prevalece el del último archivo cargado con source(). Un valor en su propia línea en un archivo cargado con source() tampoco se imprime, así que los archivos que deban mostrar algo llaman a cat():

# Tools.R
total <- 0                 # una variable global una vez cargado el archivo
42                         # source() no lo imprime
helper <- function(x) x * 2

# Other.R
helper <- function(x) x + 1   # cargado después: reemplaza la función helper anterior
challenge icon

Desafío

Fácil

El programa tiene dos archivos. main.R carga Greeting.R, lee nombres e imprime el resultado de greeting(name) para cada uno. Completa greeting() en Greeting.R para que devuelva Hello, Ada! para el nombre Ada, o Hello, friend! cuando el nombre esté vacío.

Tu código va en Greeting.R. main.R contiene el código de entrada/salida proporcionado y no se puede editar.

Pruébalo tú mismo

source("Greeting.R")

# Código de entrada/salida proporcionado: mantenlo tal como está
input <- suppressWarnings(readLines(file("stdin")))
for (name in input) cat(greeting(name), "\n", sep = "")
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de R online