我有最新版本的R (3.6.1),但是当我使用使用随机数生成器的函数时,它们默认为旧的RNG (即预3.6.0),它使用舍入而不是拒绝采样。我不知道为什么会发生这种情况,希望你能帮我解决这个问题。
set.seed(1)
sample(20)
RNGkind()
R.version以下是我跑步的结果:
set.seed(1)
sample(20)
# 6 8 11 16 4 14 15 9 19 1 3 2 20 10 5 7 12 17 18 13
RNGkind()
# "Mersenne-Twister" "Inversion" "Rounding"
R.version
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status Patched
major 3
minor 6.1
year 2019
month 09
day 06
svn rev 77160
language R
version.string R version 3.6.1 Patched (2019-09-06 r77160)
nickname Action of the Toes 基于新闻和链接讨论,我期望RNGkind()的输出如下所示:
# "Mersenne-Twister" "Inversion" "Rejection"我是不是误解了这个消息?
发布于 2019-09-19 19:57:23
正如@JanvanderLaan在评论中所建议的,一个可能的问题可能源于启动时加载的.RData文件。例如,如果您安装了以前版本的R,那么在启动会话时来自getwd()的初始工作目录将包含一个.RData文件和一个.Rhistory文件,如果一个保存了会话。通常,如果您使用Rstudio,这就是windows上的documents文件夹,大多数个人都会使用这个文件夹来清除旧的或不寻常的文件。
按照注释中的建议,在一个新的getwd()会话中转到R的目录输出,我找到了一个.RData文件,关闭了现有的R会话,而没有保存当前会话,并重新打开了一个新的R会话。它似乎正确地解决了这个问题,如下所示。因此,似乎生成随机数的方法确实保存在.Rdata文件的会话之间。
RNGkind()
[1] "Mersenne-Twister" "Inversion" "Rejection" 编辑(插图)
实际上,我们可以很容易地在一个新的R会话中说明这一点,而不管设置了哪个随机数生成器。假设在R之前曾经打开和保存过一个R-3.6.1会话,那么下面的代码就会出现问题
#Assuming that the R session has just opened
>RNGkind()
[1] "Mersenne-Twister" "Inversion" "Rounding"
>RNGversion("3.6.1")
>RNGkind()
[1] "Mersenne-Twister" "Inversion" "Rejection"
>load(".RData", verbose = TRUE)
Loading objects:
.Random.seed
>RNGkind()
[1] "Mersenne-Twister" "Inversion" "Rounding" 可以看到,它存储.Random.seed,但是没有显示的是,在加载之前的环境时,随机数生成器的类型也会被导入。执行
file.remove(".RData")
q("no")因此,如果工作目录没有在当前会话中更改,则应该解决未来会话的问题。
发布于 2019-09-20 17:21:20
我曾希望设立一笔赏金能为导致OP问题的原因找到一个明确的答案。虽然没有发生这种情况,但一些评论和回答提出了一些原因。我在这里提供了一个额外的答案,把它们放在一个地方,并提供一个更好的例子来说明如何区分一件事和另一件事发生的时间。
建议的原因:
.RData文件设置的种子。.Rprofile设置的RNG类型由.RData文件设置的种子
正如在奥利弗的回答中所讨论的,这可能是由初始工作目录中的.RData文件引起的。我不会说得更详细(你可以参考链接的答案),但我确实想展示一下,如果是这样的话,你在启动时会看到什么。在我的机器上,R中的启动消息就是这样的:
R version 3.6.1 (2019-07-05) -- "Action of the Toes"
Copyright (C) 2019 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
>如果您在启动时读取可能导致此结果的.RData文件,则会在启动消息的最后一段之后看到有关该文件的通知:
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
[Workspace loaded from ~/.RData].Rprofile设置的RNG类型
.Rprofile是一个在启动时运行的脚本,您可以使用它在会话开始时设置一些设置。(您可以阅读更多关于它的这里、这里或在R文件中)。虽然我怀疑这对您来说是这样的,但至少有可能是由于一个.Rprofile文件正在运行,其中一行如下所示
RNGkind(sample.kind = "Rounding")如果在.Rprofile文件中有这样一个导致问题的设置,您将在启动消息的末尾看到一个警告:
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
Warning message:
In RNGkind(sample.kind = "Rounding") : non-uniform 'Rounding' sampler used错误
如果您在启动时没有看到这些消息,我最好的猜测是,这是由最近在R3.6.1补丁中引入的某种错误造成的。我有点犹豫地说,但我看不到另一个选择(我曾有点希望,提供赏金将得到一个答案,提供了这样的另一个选择)。如果是这样的话,我会将其报告为一个bug;找到更多的这里。
https://stackoverflow.com/questions/57874730
复制相似问题