Menu
Coddy logo textTech

Trabalhando com Arquivos

Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 1 de 57.

Programas reais são divididos em vários arquivos. Em R, source("Greeting.R") executa outro arquivo de cima para baixo, e todas as funções definidas por esse arquivo ficam disponíveis depois:

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

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

Executar main.R imprime Hello, Ada!: a linha source() carrega greeting() antes que main.R a chame.

O programa começa no arquivo que você executa, aqui main.R, e R o lê linha por linha. A ordem importa: uma função só existe depois que o arquivo que a define foi carregado, então as linhas source() ficam no topo:

# main.R
cat(greeting("Ada"), "\n")   # Erro: não foi possível encontrar a função "greeting"
source("Greeting.R")
cat(greeting("Ada"), "\n")   # funciona: greeting() agora existe

O layout usual é uma classe por arquivo, nomeado de acordo com a classe: Account.R contém o construtor account e seus métodos, Shape.R contém os genéricos shape. Nos desafios desta seção, seu código deve ficar nesses arquivos, e main.R contém o código fornecido de entrada/saída, com as linhas source() já no topo, na ordem correta. O editor mostra cada arquivo como uma aba.

Shape.R      # genéricos compartilhados por toda forma: faça o source primeiro
Circle.R     # a classe circle e seus métodos
main.R       # source("Shape.R"); source("Circle.R"); lê a entrada, imprime os resultados

source() executa um arquivo no ambiente global, portanto suas funções e variáveis se tornam nomes globais. R não tem nomes privados de arquivo: se dois arquivos definirem helper(), o arquivo cujo código for carregado por último prevalece. Um valor em sua própria linha em um arquivo carregado também não é impresso, então os arquivos que devem exibir algo chamam cat():

# Tools.R
total <- 0                 # uma variável global uma vez sourced
42                         # não impresso por source()
helper <- function(x) x * 2

# Other.R
helper <- function(x) x + 1   # sourced mais tarde: substitui o helper acima
challenge icon

Desafio

Fácil

O programa tem dois arquivos. main.R importa Greeting.R, lê nomes e imprime o resultado de greeting(name) para cada um. Complete greeting() em Greeting.R para que ele retorne Hello, Ada! para o nome Ada ou Hello, friend! quando o nome estiver vazio.

Seu código deve estar em Greeting.R. main.R contém o código de entrada/saída fornecido e não pode ser editado.

Experimente você mesmo

source("Greeting.R")

# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
for (name in input) cat(greeting(name), "\n", sep = "")
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de R online