Menu
Coddy logo textTech

Map과 mapply

Coddy R 여정의 논리와 흐름 섹션에 포함된 레슨. 64개 중 33번째.

Map(f, xs, ys)는 두 개 이상의 벡터를 같은 보폭으로 순회하며, 각 벡터에서 하나씩 요소를 가져와 f를 호출합니다. 먼저 첫 번째 요소들로 호출하고, 그다음 두 번째 요소들로 호출하는 식으로 계속합니다. 반환값은 리스트입니다:

totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])

출력:

[1] 3
[1] 7.5

mapply()는 여러 벡터에 대해 sapply()처럼 단순화된 버전입니다. unlist()는 Map()의 리스트도 벡터로 평탄화합니다:

print(mapply(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5)))
print(unlist(Map(function(a, b) a + b, 1:3, 4:6)))

출력:

[1]  8.0 12.0  7.5
[1] 5 7 9

벡터는 위치에 따라 대응되므로 길이가 같아야 합니다. mapply()는 첫 번째 벡터를 기준으로 텍스트 결과에 이름을 지정합니다. USE.NAMES = FALSE는 이름을 제거합니다:

items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)

출력:

[1] "2 x tea" "3 x jam"

각 쌍에 if가 필요하다면 여러 인수를 받는 함수를 작성하고 mapply()에 전달하세요. 그러면 조건이 각 쌍마다 한 번씩 실행됩니다:

describe <- function(name, age) {
  group <- if (age < 18) "minor" else "adult"
  paste0(name, " (", group, ")")
}
print(mapply(describe, c("Ada", "Tim"), c(36, 12), USE.NAMES = FALSE))

출력:

[1] "Ada (adult)" "Tim (minor)"
challenge icon

챌린지

쉬움

order_lines(items, qty, prices)를 완성하세요. 항목당 한 줄씩 반환하세요. 예: 2 x tea = 8.00: 수량, x , 항목, = , 그리고 수량과 가격을 곱한 값을 소수점 이하 두 자리로 표시합니다. mapply() 또는 Map()을 사용하세요.

제공된 코드는 항목, 수량, 가격을 쉼표로 구분된 세 줄로 읽고, 반환된 각 줄을 출력합니다.

직접 해보기

order_lines <- function(items, qty, prices) {
  # 여기에 코드를 작성하세요
  character(0)
}

# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
cat(order_lines(strsplit(input[1], ",")[[1]], as.numeric(strsplit(input[2], ",")[[1]]), as.numeric(strsplit(input[3], ",")[[1]])), sep = "\n")
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

논리와 흐름의 모든 레슨

직접 연습해 보세요: 온라인 R 컴파일러