Menu

Imprimindo Saída e Lendo Entrada em R (print, cat, readline)

Como a saída funciona em R - impressão automática, print() vs cat(), message() - e como ler entrada do usuário com readline() e readLines().

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Como a Impressão Funciona em R

R tem um hábito que nenhuma outra linguagem popular compartilha: no console, você não precisa de nenhum comando de impressão. Digite o nome de uma variável, pressione enter, e R imprime seu valor. Isso é a impressão automática, e é por isso que os tutoriais de R estão cheios de expressões soltas.

Mas a impressão automática tem um limite estrito: ela só dispara para expressões no nível superior. Dentro de um loop for ou do corpo de uma função, um valor solto é avaliado e jogado fora silenciosamente:

O x sozinho imprime (está no nível superior), o primeiro loop não imprime absolutamente nada, e o segundo imprime 1, 2, 3 porque pede explicitamente. "Meu loop roda mas não mostra nada" é uma das perguntas mais feitas sobre R, e esta é a resposta completa: dentro de loops e funções, imprimir é sempre tarefa sua. (O mesmo vale quando você executa um script com Rscript - o que funcionava linha a linha no console pode ficar mudo dentro de um loop.)

print() mostra um valor da forma como R o enxerga - o que o torna a ferramenta certa para inspecionar dados, e a errada para saída polida:

Duas coisas chamam a atenção. Strings mantêm as aspas - print() está mostrando uma representação fiel, e as aspas dizem que se trata de um valor character. E cada linha começa com um número entre colchetes como [1]: esse é o índice do primeiro elemento daquela linha, então quando um vetor longo quebra em novas linhas, o colchete de cada linha diz em qual elemento ela retoma. É uma ajuda de leitura para vetores, não ruído.

Se você quiser a saída no estilo de print() sem as aspas, tanto print(x, quote = FALSE) quanto noquote(x) fazem isso - mas geralmente o que você quer nesse ponto é o cat().

cat(): Saída para Humanos

cat() (concatenar e imprimir) escreve texto puro: sem aspas, sem prefixos de índice, e com os argumentos unidos por espaços. O preço desse controle é que nada é adicionado por você automaticamente - inclusive a nova linha:

Esquecer o "\n" é o rito de passagem universal do cat() - sem ele, o próximo pedaço de saída gruda na mesma linha. Torne reflexo terminar as chamadas de cat() com "\n".

A diferença de aspas entre as duas funções é, na verdade, uma diferença naquilo que elas mostram. print() exibe as sequências de escape como você as digitou; cat() as renderiza:

print() mostra o \t e o \n literalmente entre aspas - útil quando você está depurando exatamente o que uma string contém. cat() os transforma em uma tabulação de verdade e uma quebra de linha de verdade - útil quando você está produzindo saída. Escolha pela intenção: print() para inspecionar, cat() para apresentar.

Relatórios Formatados: sprintf() + cat()

Os argumentos separados por espaço do cat() só vão até certo ponto. Para saída alinhada e formatada - decimais fixos, contadores com preenchimento - construa a string com sprintf() e entregue-a ao cat():

%-8s preenche cada nome até 8 caracteres e %6.2f dá a cada nota a mesma largura e duas casas decimais, de modo que as colunas fiquem alinhadas. Essa dupla é o cavalo de batalha do R base para mensagens de progresso e pequenos relatórios de texto (os códigos de formato são cobertos em strings).

message() e warning(): O Outro Canal

cat() e print() escrevem na saída padrão - o fluxo que carrega os resultados do seu programa. message() e warning() escrevem na saída de erro padrão, o fluxo para comentários sobre a execução:

Na tela, os dois parecem semelhantes, mas a separação importa no momento em que a saída é redirecionada: direcione o stdout do seu script para um arquivo e o 42 vai parar no arquivo enquanto a nota de status fica no terminal. Essa é a regra de bolso - resultados para o stdout com cat(), comentários para o stderr com message(). É também por isso que message() (e não cat()) é a forma educada de funções e pacotes falarem com seus usuários: quem chama pode silenciá-lo com suppressMessages() sem perder a saída real.

warning() é mais forte - "algo está estranho, mas eu segui em frente" - e quando um script roda sob o Rscript, os warnings são coletados e mostrados juntos no final, e não no meio do texto (veja depurando erros para aprender a lê-los).

Lendo Entrada do Usuário: readline() e readLines()

Para fazer uma pergunta ao usuário em uma sessão interativa (o console do R ou o RStudio), use readline(). Estes exemplos não são executáveis no editor embutido - o executor da página não tem painel de entrada - então experimente-os em um console local:

# Interactive sessions only:
name <- readline("What is your name? ")
cat("Hello,", name, "\n")

age <- as.numeric(readline("Your age? "))
cat("Next year you'll be", age + 1, "\n")

Duas coisas para lembrar. readline() sempre retorna uma string - converta com as.numeric() antes de fazer contas, e verifique o resultado quanto a NA caso o usuário tenha digitado algo que não é um número. E em um script não interativo, readline() não espera nenhuma entrada; ele retorna "" instantaneamente.

Para um script executado com Rscript que deve ler entrada digitada ou vinda de um pipe, leia da entrada padrão:

# In a script run as: echo "Ada" | Rscript greet.R
line <- readLines(con = "stdin", n = 1)
cat("Hello,", line, "\n")

readLines(con = "stdin") sem n lê todas as linhas até a entrada acabar - o formato padrão para scripts no estilo filtro. Ler arquivos de dados é um trabalho diferente com ferramentas melhores; comece por read-csv quando sua entrada for um conjunto de dados em vez de um teclado.

O Que Você Leva Daqui

  • A impressão automática só acontece no nível superior - dentro de loops e funções, chame print() ou cat() você mesmo.
  • print() inspeciona: aspas nas strings, prefixos de índice [1], escapes mostrados literalmente.
  • cat() apresenta: texto puro, argumentos unidos por espaços, e você fornece o "\n".
  • sprintf() + cat() é o padrão do R base para saída formatada e alinhada.
  • Resultados vão para o stdout (cat), comentários para o stderr (message, warning).
  • readline() para entrada interativa (sempre uma string!); readLines(con = "stdin") para o Rscript.

A seguir: operadores - aritméticos, de comparação e os operadores lógicos que movem toda condição que você vai escrever.

Perguntas frequentes

Qual é a diferença entre print() e cat() em R?

print() mostra um valor da forma como R o representa - strings mantêm as aspas e cada linha ganha um prefixo de índice no estilo [1]. cat() escreve texto puro, sem aspas, sem índices e sem nova linha automática (você mesmo adiciona "\n"). Use print() para inspecionar objetos, cat() para produzir saída para humanos.

Por que meu loop em R não imprime nada?

A impressão automática só acontece para expressões no nível superior. Dentro de um loop for ou do corpo de uma função, um x sozinho é avaliado e descartado silenciosamente. Envolva-o explicitamente: print(x) ou cat(x, "\n").

Como ler entrada do usuário em R?

Em uma sessão interativa, readline("prompt: ") lê uma linha digitada como string (converta com as.numeric() se precisar de um número). Em um script executado com Rscript, readline() não espera - leia da entrada padrão com readLines(con = "stdin", n = 1) em vez disso.

Como imprimir sem aspas em R?

Use cat("hello\n") - ele nunca adiciona aspas. Se você quiser especificamente a semântica de print() sem aspas, print("hello", quote = FALSE) ou noquote("hello") também funcionam.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR