`.Random.seed` 和 `ls()` 之间有什么关系?

What is the relationship between `.Random.seed` and `ls()`?

执行 load("files.RData"); ls() 时打印到控制台的输出是:

'File1'   'File2'   'File3'

当执行 (load("files.RData")) 时(load() 周围的括号点指示 R 打印该行的输出)打印到控制台的输出是:

'.Random.seed'   'File1'   'File2'   'File3'

问题:造成这种差异的原因是什么?

注意:这可能是 IRkernel 特有的,因为此代码在 Jupyter 笔记本中运行。

help("ls")我们可以看出all.names参数对ls()的作用,它的默认值为FALSE:

all.names: a logical value.  If ‘TRUE’, all object names are returned.
          If ‘FALSE’, names which begin with a ‘.’ are omitted.

因此,在您的第一个示例中,ls() 不会打印 .Random.seed;它以 ..

开头

现在让我们考虑 load 帮助文件的 "Value" 部分:

A character vector of the names of objects created, invisibly.

Paren:

For ‘(’, the result of evaluating the argument.  This has
 visibility set, so will auto-print if used at top-level.

因此,在您的第二个示例中,load("files.RData") 无形地 returns "A character vector of the names of objects created"(甚至 .Random.seed),但是 ( 会自动打印该字符向量,甚至包括 .Random.seed.

.Random.seed到底是什么?

首先,我们可以通过查看 help(".Random.seed"):

来了解它 是什么
 ‘.Random.seed’ is an integer vector, containing the random number
 generator (RNG) *state* for random number generation in R.  It can
 be saved and restored, but should not be altered by the user.

只要您使用 R 的伪随机数生成器之一,它就会在您的全局环境中弹出。例如,在新的 R 会话中,我可以执行以下操作:

x <- 1
ls(all.names = TRUE)
# [1] "x"

rnorm(1)
# [1] 2.378572

ls(all.names = TRUE)
# [1] ".Random.seed" "x"           

然后我可以通过 save():

保存任何或所有这些 R 对象
save(x, file = "one.RData")
save(.Random.seed, file = "two.RData")
save(x, .Random.seed, file = "all.RData")
# or, equivalently in this case,
# save(list = ls(all.names = TRUE), file = "all.RData")

如果我使用save.image()全局环境中的所有内容都会被保存,甚至以.开头的文件——根据帮助文件,它是save(list = ls(all.names = TRUE), file = ".RData", envir = .GlobalEnv).

的快捷方式

所以,无论你从哪里得到 files.RData,他们要么使用了 save.image(),要么在保存 files.RData 时故意包含了他们的 .Random.seed 对象。