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
编辑:
- 正如 rawr 的评论所建议的,我尝试指定
col_types
并且确实有效。但我仍然想知道为什么会这样。有人有解释吗?
set.seed(123)
dat <- read_csv("data/titanic.csv", col_types = c("dddccdddcdcc"))
rnorm(1)
#[1] -0.5604756
- 由于很多人询问 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;dr 在 cli
包的深处某处(调用以生成关于列类型的漂亮打印输出),代码正在生成一个用作标签的随机字符串。
一个主要线索是
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 日] 的当前版本)。
我刚刚注意到 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
编辑:
- 正如 rawr 的评论所建议的,我尝试指定
col_types
并且确实有效。但我仍然想知道为什么会这样。有人有解释吗?
set.seed(123)
dat <- read_csv("data/titanic.csv", col_types = c("dddccdddcdcc"))
rnorm(1)
#[1] -0.5604756
- 由于很多人询问 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;dr 在 cli
包的深处某处(调用以生成关于列类型的漂亮打印输出),代码正在生成一个用作标签的随机字符串。
一个主要线索是
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 日] 的当前版本)。