Menu
CoddyTech

Работа с файлами

Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 1 из 57.

Реальные программы разделены на несколько файлов. В R команда source("Greeting.R") выполняет другой файл сверху вниз, и после этого доступны все функции, определённые в этом файле:

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

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

Запуск main.R выводит Hello, Ada!: строка source() загружает greeting() до того, как main.R её вызывает.

Программа начинается в файле, который вы запускаете, здесь это main.R, и R читает его построчно. Порядок важен: функция существует только после того, как был подключён файл, в котором она определена, поэтому строки source() идут в начале:

# main.R
cat(greeting("Ada"), "\n")   # Ошибка: не удалось найти функцию "greeting"
source("Greeting.R")
cat(greeting("Ada"), "\n")   # работает: функция greeting() теперь существует

Обычно в одном файле размещают один класс, а имя файла совпадает с именем класса: в Account.R находятся конструктор account и его методы, а в Shape.R — обобщённые функции shape. В заданиях этого раздела ваш код будет находиться в этих файлах, а в main.R — предоставленный код для ввода и вывода; строки source() уже расположены в его начале в нужном порядке. В редакторе каждый файл отображается на отдельной вкладке.

Shape.R      # Общие для всех фигур обобщённые функции: сначала подключите этот файл
Circle.R     # класс круга и его методы
main.R       # source("Shape.R"); source("Circle.R"); считывает входные данные, выводит результаты

source() запускает файл в глобальном окружении, поэтому его функции и переменные становятся глобальными именами. В R нет имён, видимых только внутри файла: если два файла определяют helper(), побеждает файл, подключённый последним. Значение в отдельной строке в подключённом файле тоже не выводится, поэтому в файлах, которые должны что-то показывать, вызывают cat():

# Tools.R
total <- 0                 # глобальная переменная после загрузки через source()
42                         # не выводится при вызове source()
helper <- function(x) x * 2

# Other.R
helper <- function(x) x + 1   # загружается позже: заменяет определённую выше функцию helper
challenge icon

Задание

Легко

В программе два файла. main.R подключает Greeting.R, считывает имена и выводит результат вызова greeting(name) для каждого имени. Заверши функцию greeting() в Greeting.R, чтобы она возвращала Hello, Ada! для имени Ada или Hello, friend!, если имя пустое.

Твой код нужно написать в Greeting.R. В main.R находится предоставленный код ввода/вывода, который нельзя редактировать.

Попробуйте сами

source("Greeting.R")

# Предоставленный код ввода/вывода: оставьте его без изменений
input <- suppressWarnings(readLines(file("stdin")))
for (name in input) cat(greeting(name), "\n", sep = "")
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор R