←
PDF 346 / 520 Unknown Sequence Length
→
English · PDF 346
Original PDF page 346
中文 · PDF 346

str(unlist(out)) #> num [1:144] 0.367 1.13 -0.941 0.218 1.415 ...

这里我使用 unlist() 将一个由向量组成的列表展平为单个向量。更严格的做法是使用 purrr::flatten_dbl()——如果输入不是由双精度数组成的列表,它会抛出错误。

这种模式在其他地方也会出现:

  • 你可能正在生成一个很长的字符串。与其在每次迭代中用 paste() 与之前的结果拼接,不如把输出保存到一个字符向量中,然后用 paste(output, collapse = "") 将该向量合并为单个字符串。
  • 你可能正在生成一个很大的数据框。与其在每次迭代中依次 rbind(),不如把输出保存到一个列表中,然后用 dplyr::bind_rows(output) 将输出合并为单个数据框。

注意这种模式。每当你看到它时,就改用一个更复杂的结果对象,然后在最后一步完成合并。

未知长度的序列

有时你甚至不知道输入序列应该有多长。这在做模拟时很常见。例如,你可能想一直循环直到连续得到三次正面。这种迭代无法用 for 循环实现,但你可以使用 while 循环。while 循环比 for 循环更简单,因为它只有两个组成部分:一个条件和一段循环体:

while (condition) { # 循环体 }

while 循环也比 for 循环更通用,因为你可以把任何 for 循环改写为 while 循环,但并非每个 while 循环都能改写为 for 循环:

for (i in seq_along(x)) { # 循环体 } # 等价于 i <- 1 while (i <= length(x)) { # 循环体