데이터 타입과 구조
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 앱에서 그래프나 계산이 오류를 일으킬 수 있습니다.