2.1 프로그래밍

2.1.1 Prerequisites

  • 예약어(researved words): R에서 의미(sementic)를 미리 정해 놓은 단어
Table 2.1: R 예약어 종류 및 설명
R 예약어 설명
if, else, while, function, in, next, break 조건, 함수, 반복문에 사용
TRUE/FALSE 논리 상수(logical constants)
NULL 정의되지 않은 값 혹은 값이 없음 표현
Inf 무한(infinity)
NaN 숫자가 아님(not a number)
NA 결측값(not available)
NA_integer_, NA_real_, NA_complex_, NA_character_ 결측값을 처리하는 상수
함수가 다른 함수에 인자를 전달하도록 지원

  • 변수(variable): 사용자가 프로그램 처리를 위해 지정한 단어
  • 고수준 언어(high-level language): 사람이 읽고 쓰기 쉬운 형태의 명령어를 컴퓨터가 읽고 처리할 수 있도록 고안된 프로그래밍 언어
    • 컴퓨터가 이해할 수 있는 언어 \(\rightarrow\) 중앙처리장치(central processing unit, CPU)가 이해하는 언어 \(\rightarrow\) 기계어(machine language)
    • 기계어는 0과 1로 구성된 이진수(binary number)임(예: 0100101001001001001110110101101010110)
    • 고수준 언어의 종류: C, C++, JAVA, 베이직, Perl, Python, R, …
  • 번역기(translator): 사람이 이해할 수 있는 표현(언어)를 기계(컴퓨터)가 이해할 수 있는 언어(기계어)로 변환
    • 인터프리터(interpreter)
    • 컴파일러(compiler)
  • 인터프리터: 코드(스크립트) 한 줄을 즉석에서 읽고, 파싱(parsing, 프로그램을 검사하고 프로그램의 문법적 구조를 분석해 컴퓨터가 이해할 수 있도록 번역)하고 해석해 명령을 실행
    • R, Python, MATLAB 등은 인터프리터를 번역기로 사용
    • Interactive 모드 \(\rightarrow\) R 프롬프트(>) 뒤에 한 줄의 명령어를 작성하면 즉시 처리 후 다음 입력을 받을 준비(prompt)를 함.
안녕하세요!!
통계패키지활용 수업에서 R을 배우고 있습니다. 
처음이라 실수가 많습니다.
앞으로 잘 부탁해요!!
Error: <text>:1:6: 예기치 않은 '!'입니다
1: 안녕하세요!
         ^

print("안녕하세요!!")
print("통계패키지활용 수업을 위해 R을 배우고 있습니다.")
print("처음이라 실수가 많습니다.")
print("앞으로 잘 부탁해요!!")
[1] "안녕하세요!!"
[1] "통계패키지활용 수업을 위해 R을 배우고 있습니다."
[1] "처음이라 실수가 많습니다."
[1] "앞으로 잘 부탁해요!!"

  • 컴파일러: 완전한 프로그램을 하나의 파일에 담고 파일 안에 저장되어 있는 소스 코드를 기계어로 번역 후 다음 실행할 수 있도록 변환한 기계어를 파일에 담음.
    • 보통은 .exe, .dll 파일 형태로 저장됨

2.1.2 프로그램

  • 프로그램(program): 특정 작업(목적)을 수행할 수 있도록 작성한 일련의 R 문장(명령어)의 집합
    • 일련의 문장(명령어)들은 텍스트 편집기를 통해 작성하며, 스크립트(script)로 명칭 되는 파일로 저장 \(\rightarrow\) R 스크립트 .R 확장자를 가짐
# Hello.R 
print("안녕 R!!") #한국어
print("Hi R!!") # 영어
print("こんにちはR!!") # 일본어
print("Γεια R!!") #그리스어

source("examples/hello.R", encoding = "UTF-8")
[1] "안녕 R!!"
[1] "Hi R!!"
[1] "こんにちはR!!"
[1] "Γεια R!!"

require(tidyverse)
require(stringr)
require(ggpubr)
require(ggthemes)

text_dat <- readLines("data/text-example-01.txt")
# 공백 또는 구둣점 문자를 기준으로 텍스트 나누기

# 공백 또는 구둣점 문자 기준으로 텍스트 토큰화
split_wd <- str_split(text_dat, pattern = "\\b|[[:punct:]]") 
split_wd <- do.call(c, split_wd)
id <- grepl("[a-zA-Z]+", split_wd) #알파벳을 포함한 단어 인덱스
split_wd <- split_wd[id]
unique_wd <- unique(split_wd) # 중복을 제외한 총 사용 단어
res_v <- vector("integer", length(unique_wd)) # 저장 벡터 생성

for (i in seq_along(unique_wd)) {
  for (j in seq_along(split_wd)) {
    if (unique_wd[i] == split_wd[j]) {
      res_v[i] <- res_v[i] + 1 
    }
  }
}

bind_cols("word" = unique_wd, "freq" = res_v) %>% 
  arrange(desc(freq)) 

  • 프로그램 작성을 위한 개념적 요소
    • 입력(input): 외부로부터 가져온 데이터, 값 등
    • 출력(output): 입력에 대한 반응(결과 출력, 파일 저장, 음악 재생, …)
    • 순차실행(sequential execution): 스크립트 또는 코드 작성 순서에 따라 한줄씩 실행
    • 조건실행(conditional execution): 특정 조건에 따라 문장(명령)을 실행하거나 건너뜀
    • 번복실행(iterative execution): 특정 명령을 반복적으로 실행
    • 재사용(resuse): 스크립트의 집합(다수 줄로 구성된 코드 또는 스크립트)에 이름을 부여하고 저장 \(\rightarrow\) 사용자 지정 함수(function)
  • 프로그램 오류의 종류
    • 구문오류(syntax error): R 언어가 이해할 수 없는 문장 또는 문법으로 실행했을 때 나타나는 오류 \(\rightarrow\) 가장 고치기 쉽고 즉각적으로 알려줌
    • 논리 또는 run-time 오류(logic or run-time error): 구문은 완벽하지만 실행 순서 또는 논리적으로 연관방식에 문제가 있어서 명령어를 수행할 수 없는 경우
    • 의미론적 오류(sementic error): 프로그램은 구문적으로 오류가 없고 실행되지만 올바른 결과를 출력하지 않는 경우 \(\rightarrow\) 제일 고치기 어려움
  • 가장 간단한 프로그래밍은 순차적으로 명령을 실행하되 입력 시 흐름을 잠시 중단하고 대기하는 방법 \(\rightarrow\) 프롬프트 상 명령어 한 줄씩 입력
# 아주 간단한 프로그래밍 예제
# readline() 함수 이용해 R한테 인사 받기
name <- readline("What's your name?: ")
cat("Hello, ", name, "!\n", sep = "")

# readline() 함수를 이용해 알바비 계산

x <- as.numeric(readline(prompt = "하루 아르바이트 시간을 입력하시오: "))
y <- as.numeric(readline(prompt = "시급을 입력하시오 (단위=원): "))
z <- as.numeric(readline(prompt = "한달 동안 총 몇 일 동안 일을 하셨나요? "))
cat("월 급여는 ", x * y * z, " 원 입니다.\n", sep = "")