gpt4 book ai didi

readRDS()加载额外的程序包

转载 作者:行者123 更新时间:2023-12-03 18:25:17 27 4
gpt4 key购买 nike

在什么情况下R中的readRDS()函数会尝试加载包/命名空间?我很惊讶在新的R session 中看到以下内容:

> loadedNamespaces()
[1] "base" "datasets" "graphics" "grDevices" "methods" "stats"
[7] "tools" "utils"
> x <- readRDS('../../../../data/models/my_model.rds')
There were 19 warnings (use warnings() to see them)
> loadedNamespaces()
[1] "base" "class" "colorspace" "data.table"
[5] "datasets" "dichromat" "e1071" "earth"
[9] "evaluate" "fields" "formatR" "gbm"
[13] "ggthemes" "graphics" "grDevices" "grid"
[17] "Iso" "knitr" "labeling" "lattice"
[21] "lubridate" "MASS" "methods" "munsell"
[25] "plotmo" "plyr" "proto" "quantreg"
[29] "randomForest" "RColorBrewer" "reshape2" "rJava"
[33] "scales" "spam" "SparseM" "splines"
[37] "stats" "stringr" "survival" "tools"
[41] "utils" "wra" "wra.ops" "xlsx"
[45] "xlsxjars" "xts" "zoo"

如果这些新软件包中的任何一个都不可用,则 readRDS()失败。

提到的19条警告是:
> warnings()
Warning messages:
1: replacing previous import ‘hour’ when loading ‘data.table’
2: replacing previous import ‘last’ when loading ‘data.table’
3: replacing previous import ‘mday’ when loading ‘data.table’
4: replacing previous import ‘month’ when loading ‘data.table’
5: replacing previous import ‘quarter’ when loading ‘data.table’
6: replacing previous import ‘wday’ when loading ‘data.table’
7: replacing previous import ‘week’ when loading ‘data.table’
8: replacing previous import ‘yday’ when loading ‘data.table’
9: replacing previous import ‘year’ when loading ‘data.table’
10: replacing previous import ‘here’ when loading ‘plyr’
11: replacing previous import ‘hour’ when loading ‘data.table’
12: replacing previous import ‘last’ when loading ‘data.table’
13: replacing previous import ‘mday’ when loading ‘data.table’
14: replacing previous import ‘month’ when loading ‘data.table’
15: replacing previous import ‘quarter’ when loading ‘data.table’
16: replacing previous import ‘wday’ when loading ‘data.table’
17: replacing previous import ‘week’ when loading ‘data.table’
18: replacing previous import ‘yday’ when loading ‘data.table’
19: replacing previous import ‘year’ when loading ‘data.table’

因此,显然,它先加载了诸如 lubridate然后是 data.table之类的东西,从而随即生成了 namespace 冲突。

FWIW, unserialize()给出相同的结果。

我真正想要的是加载这些对象,而不同时加载保存它们的人当时似乎已经加载的所有东西,这就是它的工作方式。

更新:这是对象 x中的类:
> classes <- function(x) {
cl <- c()
for(i in x) {
cl <- c(cl, if(is.list(i)) c(class(i), classes(i)) else class(i))
}
cl
}
> unique(classes(x))
[1] "list" "numeric" "rq"
[4] "terms" "formula" "call"
[7] "character" "smooth.spline" "integer"
[10] "smooth.spline.fit"
qr来自 quantreg包,其余所有来自 basestats

最佳答案

好的。这可能不是一个有用的答案(需要更多详细信息),但我认为这至少是“在什么情况下..”这一部分的要求。

首先,我认为它不是特定于readRDS的,但对于可以被save编码的任何load'd对象,其工作方式相同。

“在什么情况下”部分:当保存的对象包含以包/命名空间环境为父环境的环境时。或者当它包含一个环境是包/命名空间环境的函数时。

require(Matrix)
foo <- list(
a = 1,
b = new.env(parent=environment(Matrix)),
c = "c")
save(foo, file="foo.rda")
loadedNamespaces() # Matrix is there!
detach("package:Matrix")
unloadNamespace("Matrix")
loadedNamespaces() # no Matrix there!
load("foo.rda")
loadedNamespaces() # Matrix is back again

并且以下工作也可以:
require(Matrix)
bar <- list(
a = 1,
b = force,
c = "c")
environment(bar$b) <- environment(Matrix)
save(bar, file="bar.rda")
loadedNamespaces() # Matrix is there!
detach("package:Matrix")
unloadNamespace("Matrix")
loadedNamespaces() # no Matrix there!
load("bar.rda")
loadedNamespaces() # Matrix is back!

我没有尝试过,但是没有理由为什么它不应该与 saveRDS/ readRDS一起工作。解决方案:如果这对保存的对象没有害处(即,如果您确定实际上不需要环境),则可以通过替换父环境来删除它们,例如通过将 parent.env设置为有意义的内容。因此,使用上面的 foo
parent.env(foo$b) <- baseenv()
save(foo, file="foo.rda")
loadedNamespaces() # Matrix is there ....
unloadNamespace("Matrix")
loadedNamespaces() # no Matrix there ...
load("foo.rda")
loadedNamespaces() # still no Matrix ...

关于readRDS()加载额外的程序包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19146684/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com