Menu

R에서 출력하고 입력 읽기 (print, cat, readline)

R에서 출력이 동작하는 방식(자동 출력, print()와 cat()의 차이, message())과 readline() 및 readLines()로 사용자 입력을 읽는 방법을 다룹니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

R에서 출력이 동작하는 방식

R에는 다른 주류 언어에는 없는 습관이 있습니다. 콘솔에서는 print 문이 아예 필요 없다는 점입니다. 변수 이름을 입력하고 Enter를 누르면 R이 값을 출력합니다. 이것이 자동 출력이며, R 튜토리얼에 단독 표현식이 가득한 이유입니다.

하지만 자동 출력에는 엄격한 경계가 있습니다. 최상위 수준의 표현식에서만 발동한다는 점입니다. for 반복문이나 함수 본문 안에서 단독 값은 평가된 뒤 조용히 버려집니다.

단독 x는 최상위 수준이므로 출력되고, 첫 반복문은 아무것도 출력하지 않으며, 두 번째 반복문은 명시적으로 요청했기 때문에 1, 2, 3을 출력합니다. "반복문은 도는데 아무것도 안 보여요"는 R에서 가장 많이 나오는 질문 중 하나이고, 답은 이것이 전부입니다. 반복문과 함수 안에서는 출력이 언제나 여러분의 몫입니다. (Rscript로 스크립트를 실행할 때도 마찬가지입니다. 콘솔에서 한 줄씩 잘 되던 것이 반복문 안에서는 조용해질 수 있습니다.)

print()는 R이 보는 방식 그대로 값을 보여 줍니다. 그래서 데이터를 살펴보는 데에는 알맞고 다듬어진 출력에는 알맞지 않습니다.

두 가지가 눈에 띕니다. 문자열은 따옴표를 유지합니다. print()는 충실한 표현을 보여 주는 것이고, 따옴표는 그것이 문자형 값임을 알려 줍니다. 그리고 각 줄은 [1]처럼 대괄호 숫자로 시작합니다. 이것은 그 줄의 첫 원소 인덱스로, 긴 벡터가 여러 줄로 감길 때 각 줄이 몇 번째 원소부터 이어지는지 알려 줍니다. 소음이 아니라 벡터를 읽는 보조 장치입니다.

따옴표 없이 print() 형태의 출력을 원한다면 print(x, quote = FALSE)noquote(x) 모두 가능합니다. 다만 그 시점에 실제로 원하는 것은 대개 cat()입니다.

cat(): 사람을 위한 출력

cat()(연결하고 출력하기)은 날것의 텍스트를 씁니다. 따옴표도, 인덱스 접두사도 없고, 인자들은 공백으로 이어집니다. 그 통제권의 대가로 줄바꿈을 포함해 아무것도 대신 붙여 주지 않습니다.

"\n"을 빼먹는 것은 모두가 거치는 cat() 통과 의례입니다. 그것이 없으면 다음 출력이 같은 줄에 붙어 버립니다. cat() 호출을 "\n"으로 끝내는 것을 반사적으로 만드세요.

두 함수의 따옴표 차이는 사실 무엇을 보여 주는가의 차이입니다. print()는 이스케이프 시퀀스를 여러분이 입력한 그대로 보여 주고, cat()은 실제로 렌더링합니다.

print()는 따옴표 안에서 \t\n을 문자 그대로 보여 줍니다. 문자열이 정확히 무엇을 담고 있는지 디버깅할 때 유용합니다. cat()은 그것들을 실제 탭과 줄바꿈으로 바꿉니다. 출력을 만들 때 유용합니다. 의도에 따라 고르세요. 살펴볼 때는 print(), 보여 줄 때는 cat()입니다.

서식 있는 보고서: sprintf() + cat()

cat()의 공백 구분 인자만으로는 한계가 있습니다. 소수 자릿수를 고정하고 자릿수를 채워 정렬된 출력을 만들려면 sprintf()로 문자열을 만든 뒤 cat()에 넘기세요.

%-8s는 각 이름을 8자로 채우고 %6.2f는 모든 점수에 같은 폭과 소수 두 자리를 부여해 열이 맞춰집니다. 이 조합은 진행 메시지와 짧은 텍스트 보고서를 만드는 기본 R의 주력 도구입니다(서식 코드는 문자열에서 다룹니다).

message()와 warning(): 또 하나의 통로

cat()print()는 프로그램의 결과를 담는 스트림인 표준 출력에 씁니다. message()warning()은 실행에 대한 설명을 담는 스트림인 표준 오류에 씁니다.

화면에서는 둘 다 비슷해 보이지만, 출력을 리디렉션하는 순간 이 분리가 중요해집니다. 스크립트의 stdout을 파일로 보내면 42는 파일에 들어가고 상태 메시지는 터미널에 남습니다. 경험 법칙은 이렇습니다. 결과는 cat()으로 stdout에, 설명은 message()로 stderr에 보내세요. 함수와 패키지가 사용자에게 말을 걸 때 cat()이 아니라 message()가 예의 바른 방법인 이유이기도 합니다. 호출자가 진짜 출력을 잃지 않으면서 suppressMessages()로 조용히 만들 수 있기 때문입니다.

warning()은 더 강합니다. "뭔가 이상하지만 계속 진행했다"는 뜻이며, 스크립트를 Rscript로 실행하면 경고들이 모였다가 중간이 아니라 끝에서 함께 표시됩니다(읽는 법은 오류 디버깅 참고).

사용자 입력 읽기: readline()과 readLines()

대화형 세션(R 콘솔이나 RStudio)에서 사용자에게 질문하려면 readline()을 쓰세요. 아래 예제는 페이지 안의 실행기에 입력 패널이 없기 때문에 임베디드 편집기에서 실행할 수 없습니다. 로컬 콘솔에서 시도해 보세요.

# 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")

기억할 것이 두 가지 있습니다. readline()은 항상 문자열을 돌려주므로 계산 전에 as.numeric()으로 변환하고, 사용자가 숫자가 아닌 것을 입력했을 경우를 대비해 결과가 NA인지 확인하세요. 그리고 비대화형 스크립트에서는 readline()이 입력을 전혀 기다리지 않고 즉시 ""를 돌려줍니다.

파이프로 들어오거나 타이핑된 입력을 읽어야 하는 Rscript 실행 스크립트에서는 대신 표준 입력에서 읽으세요.

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

n 없이 readLines(con = "stdin")을 쓰면 입력이 끝날 때까지 모든 줄을 읽습니다. 필터 형태의 스크립트가 갖는 표준 모양입니다. 데이터 파일을 읽는 것은 다른 일이며 더 좋은 도구가 있습니다. 입력이 키보드가 아니라 데이터셋이라면 read-csv에서 시작하세요.

핵심 정리

  • 자동 출력은 최상위 수준에서만 일어납니다. 반복문과 함수 안에서는 직접 print()cat()을 호출하세요.
  • print()는 살펴보기용입니다. 문자열에 따옴표가 붙고, [1] 인덱스 접두사가 붙으며, 이스케이프가 문자 그대로 보입니다.
  • cat()은 보여 주기용입니다. 날것의 텍스트를 공백으로 이어 주고, "\n"여러분이 붙여야 합니다.
  • sprintf() + cat()은 서식 있고 정렬된 출력을 만드는 기본 R의 패턴입니다.
  • 결과는 stdout(cat)으로, 설명은 stderr(message, warning)로 보냅니다.
  • 대화형 입력에는 readline()(항상 문자열입니다!), Rscript에는 readLines(con = "stdin")을 사용하세요.

다음 순서는 연산자입니다. 산술, 비교, 그리고 여러분이 쓰게 될 모든 조건을 움직이는 논리 연산자를 다룹니다.

자주 묻는 질문

R에서 print()와 cat()의 차이는 무엇인가요?

print()는 R이 값을 표현하는 방식 그대로 보여 줍니다. 문자열은 따옴표를 유지하고 각 줄에는 [1] 형태의 인덱스 접두사가 붙습니다. cat()은 따옴표도 인덱스도 없이 날것의 텍스트를 쓰며 줄바꿈도 자동으로 넣지 않습니다(직접 "\n"을 붙여야 합니다). 객체를 살펴볼 때는 print()를, 사람이 읽을 출력을 만들 때는 cat()을 쓰세요.

R 반복문이 왜 아무것도 출력하지 않나요?

자동 출력은 최상위 수준의 표현식에서만 일어납니다. for 반복문이나 함수 본문 안에서 단독 x는 평가된 뒤 조용히 버려집니다. print(x)cat(x, "\n")처럼 명시적으로 감싸세요.

R에서 사용자 입력은 어떻게 읽나요?

대화형 세션에서는 readline("prompt: ")이 입력한 한 줄을 문자열로 읽습니다(숫자가 필요하면 as.numeric()으로 변환하세요). Rscript로 실행하는 스크립트에서는 readline()이 기다리지 않으므로, 대신 readLines(con = "stdin", n = 1)로 표준 입력에서 읽으세요.

R에서 따옴표 없이 출력하려면 어떻게 하나요?

cat("hello\n")을 쓰세요. 따옴표를 절대 붙이지 않습니다. 따옴표 없이 print()의 동작을 원한다면 print("hello", quote = FALSE)noquote("hello")도 동작합니다.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기