轨道
/
R
R
/
练习
/
奥赞的播放列表
奥赞的播放列表

奥赞的播放列表

学习练习

简介

R 没有单独的集合数据类型,而是通过各种函数在向量上完成类似的操作。

%in% 运算符用来判断某个元素是否属于某个集合。

2 %in% 1:10 # TRUE
12 %in% 1:10 # FALSE

相关函数包括unique(用于去除重复项),以及union()、intersect()、setdiff()和setequal(),它们用于对成对的集合进行操作。

> set_1 <- c("a", "b", "c", "b", "a")
> unique(set_1) # deduplicate
[1] "a" "b" "c"

> set_2 <- c('a', "c", "d")
> union(set_1, set_2) # values in either set
[1] "a" "b" "c" "d"

> intersect(set_1, set_2) # values in both sets
[1] "a" "c"

> setdiff(set_1, set_2) # values in set_1 but not set_2
[1] "b"

> setdiff(set_2, set_1) # values in set_2 but not set_1
[1] "d"

setequal(set_1, c("c", "b", "a", "b")) # are elements the same after deduplication?
[1] TRUE

在以上每种情况下,set_1 和 set_2 都保持不变。

说明

Ozan 正在为即将到来的公路旅行整理一份播放列表。他不想重复听到同一首曲目,但播放列表已经变得太长,他记不清哪些曲目已经添加过了。

Ozan 的音乐播放器的 API 只支持处理向量,无法使用显式循环或 if/else 逻辑。他需要你的帮助!

1. 删除重复的曲目

实现remove_duplicates函数,它接收一个播放列表作为_形参_,并_返回_一个新播放列表,其中所有曲目都是唯一的。

> playlist <- c(
  "Court and Spark - Joni Mitchell",
  "Big Yellow Taxi - Joni Mitchell",
  "Court and Spark - Joni Mitchell"
)

> remove_duplicates(playlist)
[1] "Court and Spark - Joni Mitchell" "Big Yellow Taxi - Joni Mitchell"

2. 检查某首曲目是否已经添加

实现has_track函数,它接收一个播放列表和一首曲目作为_形参_,并_返回_一个布尔值,表示播放列表中是否包含该曲目。

> playlist <- c(
  "The Fashion Show - Grace Jones",
  "Dr. Funkenstein - Parliament"
)

> has_track(playlist, "Dr. Funkenstein - Parliament")
[1] TRUE

> has_track(playlist, "Walking in the Rain - Grace Jones")
[1] FALSE

3. 添加曲目

实现add_tracks函数,它接收一个播放列表和一个包含一首或多首曲目的向量作为_形参_,并_返回_一个包含这些曲目的新播放列表。

> playlist <- c("Selma - Bijelo Dugme")

> playlist <- add_tracks(playlist, "Atomic Dog - George Clinton")
> playlist
[1] "Selma - Bijelo Dugme"   "Atomic Dog - George Clinton"

> add_tracks(playlist, "Selma - Bijelo Dugme")
[1] "Selma - Bijelo Dugme"   "Atomic Dog - George Clinton"

> add_tracks(playlist, c("The Chain - Fleetwood Mac", "Selma - Bijelo Dugme"))
[1] "Selma - Bijelo Dugme"   "Atomic Dog - George Clinton" "The Chain - Fleetwood Mac"  

4. 删除曲目

实现delete_tracks函数,它接收一个播放列表和一首或多首曲目作为_形参_,并_返回_一个不包含这些曲目的新播放列表。

> playlist <- c(
  "The Treasure - Fra Lippo Lippi",
  "After the Fall - Klaus Nomi"
)

> playlist <- delete_tracks(playlist, "The Treasure - Fra Lippo Lippi")
> playlist
[1] "After the Fall - Klaus Nomi"

> delete_tracks(playlist, "I Feel the Magic - Belinda Carlisle")
[1] "After the Fall - Klaus Nomi"

5. 比较播放列表

Ozan 结识了一位新朋友,想知道他们的品味有多相似。 实现find_common_tracks函数,它接收两个播放列表,返回一个只包含两者共有曲目的新播放列表。

> playlist_1 <- c("Karma - Taylor Swift", "Tired - Adele")
> playlist_2 <- c("Andromeda - Weyes Blood", "Karma - Taylor Swift")
> find_common_tracks(playlist_1, playlist_2)
[1] "Karma - Taylor Swift"
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
R Exercism

准备好开始 奥赞的播放列表 了吗?

注册 Exercism,借助 21 个概念111 个练习 和真人导师指导,学习并掌握 R,全部免费。