【发布时间】:2012-09-12 00:23:20
【问题描述】:
如何保存 MDS 对象以供下一次 R 会话使用?因为 metaMDS() 函数使用了多次随机重启,所以每次都会产生略有不同的答案。我需要输出在 R 的多个会话中保持一致。我怎样才能做到这一点?谢谢
我所指的排序对象类型的示例:
data(dune)
sol <- metaMDS(dune)
sol
【问题讨论】:
如何保存 MDS 对象以供下一次 R 会话使用?因为 metaMDS() 函数使用了多次随机重启,所以每次都会产生略有不同的答案。我需要输出在 R 的多个会话中保持一致。我怎样才能做到这一点?谢谢
我所指的排序对象类型的示例:
data(dune)
sol <- metaMDS(dune)
sol
【问题讨论】:
@csgillespie 展示了如何使metaMDS() 的结果可重现。在您使用metaMDS() 或在 R 或其他软件中使用伪随机数生成器的任何其他函数时,应始终设置伪随机数生成器种子,否则您将无法重现结果。
但是,某些metaMDS() 拟合可能需要大量计算时间,因此将结果对象序列化到磁盘是一种选择。为此,您需要 save() 或 saveRDS()。两者的区别在于前者 (save()) 保存了包括其名称在内的整个对象。 saveRDS() 只序列化对象本身,而不是当前会话中的对象名称。
load()可以用来恢复save()保存的对象。它将对象加载到当前会话中,并将覆盖具有相同名称的对象。 readRDS()用于加载saveRDS()序列化的对象。
require("vegan")
## The recommended way of running NMDS (Minchin 1987)
##
data(dune)
## Global NMDS using monoMDS
## set the seed
set.seed(1)
sol <- metaMDS(dune)
save(sol, file = "my_sol.rda")
ls()
rm(sol)
load("my_sol.rda")
ls()
saveRDS(sol, file = "my_sol.rds")
ls()
sol2 <- readRDS("my_sol.rds")
ls()
all.equal(sol, sol2)
一些相关的输出是:
> save(sol, file = "my_sol.rda")
> ls()
[1] "dune" "sol"
> rm(sol)
> load("my_sol.rda")
> ls()
[1] "dune" "sol"
>
> saveRDS(sol, file = "my_sol.rds")
> ls()
[1] "dune" "sol"
> sol2 <- readRDS("my_sol.rds")
> ls()
[1] "dune" "sol" "sol2"
> all.equal(sol, sol2)
[1] TRUE
【讨论】:
当你想使用相同的随机数时,你需要设置随机数种子。例如,
##For some positive number
R> set.seed(1)
R> runif(1)
[1] 0.2655
R> set.seed(1)
R> runif(1)
[1] 0.2655
在您的示例中,只需在函数调用之前使用set.seed。
【讨论】: