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

Alb*_*app 8 r readr

我只是注意到以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
Run Code Online (Sandbox Code Playgroud)

编辑:

  1. 正如rawr的评论所建议的那样,我尝试指定col_types并且确实有效。但我仍然想知道为什么会发生这种情况。有人有解释吗?
set.seed(123)
dat <- read_csv("data/titanic.csv", col_types = c("dddccdddcdcc"))
rnorm(1)
#[1] -0.5604756
Run Code Online (Sandbox Code Playgroud)
  1. 由于很多人询问 R 和readr版本,这里是我的会话信息。
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
Run Code Online (Sandbox Code Playgroud)

reprex 包( v2.0.0 )于 2021 年 6 月 10 日创建

Ben*_*ker 3

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


一个主要线索是

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

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

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

cli::cli_h1("Column specification")
Run Code Online (Sandbox Code Playgroud)

调试函数后,更改发生在 ; 的某处cli::cli__message。具体来说,在我们执行这一行之前

 if ("id" %in% names(args) && is.null(args$id)) args$id <- new_uuid()
Run Code Online (Sandbox Code Playgroud)

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

沿着链条返回并手动尝试,我们可以看到手动评估

glue_cmd(text, .envir = .envir)
Run Code Online (Sandbox Code Playgroud)

此时代码中的随机信息会发生变化。

更多单步执行将我们带到一个glue_cmd调用点,此时make_cmd_transformer我们调用一个名为 的函数:random_id()

values$marker <- random_id()
Run Code Online (Sandbox Code Playgroud)

random_id()然后打电话sample...

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


这是使用readr1.4.0 和cli2.5.0 完成的(尽管代码引用是 GitHub 上的当前版本 [2021 年 6 月 10 日])。