read_csv() 使用随机数做什么?

What does read_csv() use random numbers for?

我刚刚注意到 read_csv() 以某种方式使用了意外的随机数(至少对我而言)。相应的基本 R 函数 read.csv() 不会那样做。那么,read_csv() 随机数有什么用呢?我查看了文档,但找不到明确的答案。随机数是否与 guess_max 参数有关?

library(tidyverse)
set.seed(123)
rnorm(1)
# [1] -0.5604756

set.seed(123)
dat <- read.csv("data/titanic.csv")
rnorm(1)
# [1] -0.5604756

set.seed(123)
dat <- read_csv("data/titanic.csv")
rnorm(1)
#[1] 1.239496

编辑:

  1. 正如 rawr 的评论所建议的,我尝试指定 col_types 并且确实有效。但我仍然想知道为什么会这样。有人有解释吗?
set.seed(123)
dat <- read_csv("data/titanic.csv", col_types = c("dddccdddcdcc"))
rnorm(1)
#[1] -0.5604756
  1. 由于很多人询问 R 和 readr 版本,这里是我的会话信息。
library(readr)
sessioninfo::session_info()
#> - Session info ---------------------------------------------------------------
#>  setting  value                       
#>  version  R version 4.0.5 (2021-03-31)
#>  os       Windows 10 x64              
#>  system   x86_64, mingw32             
#>  ui       RTerm                       
#>  language (EN)                        
#>  collate  German_Germany.1252         
#>  ctype    German_Germany.1252         
#>  tz       Europe/Berlin               
#>  date     2021-06-10                  
#> 
#> - Packages -------------------------------------------------------------------
#>  package     * version     date       lib source                            
#>  cli           2.5.0       2021-04-26 [1] CRAN (R 4.0.3)                    
#>  crayon        1.4.1       2021-02-08 [1] CRAN (R 4.0.4)                    
#>  digest        0.6.27      2020-10-24 [1] CRAN (R 4.0.3)                    
#>  ellipsis      0.3.2       2021-04-29 [1] CRAN (R 4.0.3)                    
#>  evaluate      0.14        2019-05-28 [1] CRAN (R 4.0.3)                    
#>  fansi         0.5.0       2021-05-25 [1] CRAN (R 4.0.5)                    
#>  fastmap       1.1.0       2021-01-25 [1] CRAN (R 4.0.5)                    
#>  fs            1.5.0       2020-07-31 [1] CRAN (R 4.0.3)                    
#>  glue          1.4.2       2020-08-27 [1] CRAN (R 4.0.3)                    
#>  highr         0.9         2021-04-16 [1] CRAN (R 4.0.5)                    
#>  hms           1.0.0       2021-01-13 [1] CRAN (R 4.0.5)                    
#>  htmltools     0.5.1.9003  2021-05-07 [1] Github (rstudio/htmltools@e12171e)
#>  knitr         1.33        2021-04-24 [1] CRAN (R 4.0.5)                    
#>  lifecycle     1.0.0       2021-02-15 [1] CRAN (R 4.0.4)                    
#>  magrittr      2.0.1       2020-11-17 [1] CRAN (R 4.0.3)                    
#>  pillar        1.6.1       2021-05-16 [1] CRAN (R 4.0.5)                    
#>  pkgconfig     2.0.3       2019-09-22 [1] CRAN (R 4.0.3)                    
#>  ps            1.6.0       2021-02-28 [1] CRAN (R 4.0.5)                    
#>  R6            2.5.0       2020-10-28 [1] CRAN (R 4.0.3)                    
#>  readr       * 1.4.0       2020-10-05 [1] CRAN (R 4.0.5)                    
#>  reprex        2.0.0       2021-04-02 [1] CRAN (R 4.0.5)                    
#>  rlang         0.4.11.9000 2021-05-29 [1] Github (r-lib/rlang@7797cdf)      
#>  rmarkdown     2.8.1       2021-05-07 [1] Github (rstudio/rmarkdown@e98207f)
#>  rstudioapi    0.13        2020-11-12 [1] CRAN (R 4.0.3)                    
#>  sessioninfo   1.1.1       2018-11-05 [1] CRAN (R 4.0.3)                    
#>  stringi       1.5.3       2020-09-09 [1] CRAN (R 4.0.3)                    
#>  stringr       1.4.0       2019-02-10 [1] CRAN (R 4.0.3)                    
#>  tibble        3.1.2       2021-05-16 [1] CRAN (R 4.0.5)                    
#>  utf8          1.2.1       2021-03-12 [1] CRAN (R 4.0.3)                    
#>  vctrs         0.3.8       2021-04-29 [1] CRAN (R 4.0.3)                    
#>  withr         2.4.2       2021-04-18 [1] CRAN (R 4.0.5)                    
#>  xfun          0.22        2021-03-11 [1] CRAN (R 4.0.5)                    
#>  yaml          2.2.1       2020-02-01 [1] CRAN (R 4.0.3)                    
#> 
#> [1] C:/Users/Albert/Documents/R/win-library/4.0
#> [2] C:/Program Files/R/R-4.0.5/library

reprex package (v2.0.0)

于 2021-06-10 创建

tl;drcli 包的深处某处(调用以生成关于列类型的漂亮打印输出),代码正在生成一个用作标签的随机字符串。


一个主要线索是

set.seed(123); dat <- read_csv("iris.csv", col_types=cols()); rnorm(1)

运行 read_csv 猜测列类型但不打印有关猜测的信息; 这并没有命中 RNG,这让我觉得这是彩色印刷中的东西。

通过复制随机种子信息 (R <- .Random.seed) 并单步执行代码 (debug(readr::show_cols_spec)) 并定期 运行 identical(R, .Random.seed) 检查状态,我发现随机信息在 运行

之后发生了变化
cli::cli_h1("Column specification")

调试到那个函数,变化发生在cli::cli__message某处;具体来说,就在我们执行此行之前

 if ("id" %in% names(args) && is.null(args$id)) args$id <- new_uuid()

(在cli的源代码中是here),identical(R, .Random.seed)仍然是TRUE;在 运行 之后,它是 FALSE。更具体地说,此时我们所要做的就是 评估 args 参数(例如,通过在调试器中键入 args)。

按照我们的方式返回链并手动尝试,我们可以看到手动评估

glue_cmd(text, .envir = .envir)

at this point in the code 更改随机信息。

仍然 更多 单步执行将我们带到 glue_cmd 中的一个点,我们调用 make_cmd_transformer,在 this point 中我们调用一个函数random_id():

values$marker <- random_id()

random_id() 然后调用 sample ...

我不知道为什么 cli 的这个内部位需要生成一个随机字符串,但我想你可以问维护者?


这是使用 readr 1.4.0 和 cli 2.5.0 完成的(尽管代码参考是 GitHub [2021 年 6 月 10 日] 的当前版本)。