←
PDF 325 / 520 scalars: instead, a single number is a vector of length 1. Because there are no scalars, most bu
→
English · PDF 325
Original PDF page 325
中文 · PDF 325

标量:相反,单个数字就是长度为 1 的向量。由于不存在标量,大多数内置函数都是向量化的,也就是说它们会对数字向量进行操作。这就是为什么,例如,以下代码可以运行:

sample(10) + 100 #> [1] 109 108 104 102 103 110 106 107 105 101 runif(10) > 0.5 #> [1] TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE #> [10] TRUE

在 R 中,基本数学运算可以直接作用于向量。这意味着在执行简单的数学计算时,你永远不需要进行显式的迭代。

如果将两个长度相同的向量相加,或者将一个向量与一个“标量”相加,结果是什么是很直观的,但如果将两个长度不同的向量相加会发生什么呢?

1:10 + 1:2 #> [1] 2 4 4 6 6 8 8 10 10 12

在这里,R 会将较短的向量扩展到与最长向量相同的长度,这就是所谓的循环补齐。除非较长向量的长度不是较短向量长度的整数倍,否则这一过程不会发出任何提示:

1:10 + 1:3 #> Warning in 1:10 + 1:3: #> longer object length is not a multiple of shorter #> object length #> [1] 2 4 6 5 7 9 8 10 12 11

虽然向量循环补齐可以用来编写非常简洁、巧妙的代码,但它也可能悄悄地掩盖问题。因此,tidyverse 中的向量化函数在你循环补齐标量以外的任何内容时都会抛出错误。如果你确实想要进行循环补齐,就需要自己使用 rep() 来实现:

tibble(x = 1:4, y = 1:2) #> Error: Variables must be length 1 or 4. #> Problem variables: 'y'

tibble(x = 1:4, y = rep(1:2, 2)) #> # A tibble: 4 × 2 #> x y #> #> 1 1 1 #> 2 2 2 #> 3 3 1 #> 4 4 2