标量:相反,单个数字就是长度为 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 #>