iBetter Books
수정

데이터 타입과 구조

Shiny 앱의 서버 로직은 결국 R 코드입니다. 데이터를 다루는 가장 기본적인 구조인 벡터, 리스트, 데이터프레임을 빠르게 복습합니다.

벡터 (Vector)

R의 가장 기본적인 데이터 구조입니다. 같은 타입의 값을 여러 개 담을 수 있습니다.

# 숫자 벡터
scores <- c(85, 92, 78, 95, 88)

# 문자 벡터
names <- c("Alice", "Bob", "Charlie")

# 논리 벡터
pass <- c(TRUE, TRUE, FALSE, TRUE, TRUE)

# 벡터 연산 — 모든 요소에 한 번에 적용됩니다
scores * 1.1       # 10% 보너스
scores[scores > 90] # 90점 초과만 필터

벡터는 Shiny에서 드롭다운 선택지를 만들거나, 데이터를 요약하는 데 자주 사용합니다.

# Shiny selectInput의 choices에 벡터를 사용합니다
cities <- c("서울", "부산", "대구", "인천")

리스트 (List)

리스트는 다양한 타입의 값을 하나로 묶을 수 있습니다. 벡터와 달리 각 요소의 타입이 달라도 됩니다.

# 다양한 타입을 담는 리스트
student <- list(
  name = "Alice",
  age = 23,
  scores = c(85, 92, 78),
  passed = TRUE
)

# 요소 접근
student$name       # "Alice"
student[["age"]]   # 23
student$scores[2]  # 92

Shiny에서 input 객체도 내부적으로 리스트와 비슷하게 동작합니다. input$slider_id처럼 $를 사용해 값에 접근합니다.

데이터프레임 (Data Frame)

데이터프레임은 엑셀 시트와 비슷한 구조입니다. 행(관측값)과 열(변수)로 이루어진 표 형태입니다.

# 데이터프레임 생성
df <- data.frame(
  name = c("Alice", "Bob", "Charlie"),
  score = c(85, 92, 78),
  grade = c("B", "A", "C")
)

# 데이터 확인
nrow(df)     # 행 수: 3
ncol(df)     # 열 수: 3
str(df)      # 구조 요약
head(df, 2)  # 처음 2행만 보기

# 열 접근
df$name      # name 열
df[, "score"] # score 열 (행렬 인덱싱)
df[1, ]      # 첫 번째 행

Shiny에서 데이터를 테이블로 표시하거나 그래프를 그릴 때 데이터프레임이 핵심 자료 구조로 사용됩니다.

팩터 (Factor)

팩터는 범주형 데이터를 표현합니다. 성별, 지역, 등급처럼 정해진 값의 집합일 때 사용합니다.

grade <- factor(c("A", "B", "A", "C", "B"),
                levels = c("A", "B", "C"))

table(grade)  # 각 범주별 개수
# A B C
# 2 2 1

Shiny의 selectInput에 팩터를 연결하면 정의된 순서대로 선택지가 표시됩니다.

타입 확인과 변환

x <- "42"
class(x)        # "character"
is.numeric(x)   # FALSE

y <- as.numeric(x)
class(y)        # "numeric"
is.numeric(y)   # TRUE

Shiny에서 input$textInput으로 받은 값은 항상 문자열입니다. 숫자로 계산해야 할 때는 as.numeric()으로 변환해야 합니다.

결측값 처리

R에서 결측값은 NA로 표현합니다.

scores <- c(85, NA, 78, NA, 88)

is.na(scores)              # 결측 여부 확인
sum(is.na(scores))         # 결측값 개수: 2
mean(scores, na.rm = TRUE) # 결측값 제외 평균: 83.67
scores[!is.na(scores)]     # 결측값 제거

결측값을 제대로 처리하지 않으면 Shiny 앱에서 그래프나 계산이 오류를 일으킬 수 있습니다.