【问题标题】:What does read_csv() use random numbers for?read_csv() 使用随机数做什么?
【发布时间】:2021-08-26 18:25:17
【问题描述】:

我刚刚注意到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 创建

【问题讨论】:

  • 函数read_csv() 没有“使用”随机种子。该函数读取文件名提供的文件。但是,您是对的,它破坏了种子的适用性。只需读入数据,然后设置种子。然后您的rnorm() 将按预期工作。
  • 什么版本的 R?使用 R-4.0.3,我在 read.csvreadr::read_csv 之后得到 -0.56。 (使用readr-1.3.1。)
  • 很想知道packageVersion("read_csv") ...
  • 当我指定col_types时,我得到-0.5604756的预期
  • @rawr,当 not 使用 col_types 时,您是否获得了备用值?包版本? @r2evans,您是否阅读了 titanic 数据集或其他数据集的副本? (我稍微浏览了一下代码,寻找对 sample() 或其他使用 RNG 的东西的调用,没有任何东西跳出来)

标签: r readr


【解决方案1】:

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


一个主要的线索是

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

运行read_csv 猜测列类型,但不打印关于猜测的信息; 这不会击中 RNG,这让我觉得这是花哨的彩色印刷。

通过复制随机种子信息 (R &lt;- .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 日])。

【讨论】:

  • 感谢您的详细解答。我在GitHub 上问了一个关于random_id() 的目的的问题。也许那里的人可以对此发表评论。
  • 引用cli 的维护者的话:“随机字符串通常用于文本处理中,作为标记,当您需要确保您的标记不会出现在文本本身中时。”尽管如此,它还是被归类为错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多