2013-10-02 8 views
7

При каких обстоятельствах функция readRDS() в R пытается загрузить пакеты/пространства имен? Я был удивлен увидеть следующее в свежем R сессии:readRDS() загружает дополнительные пакеты

> 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 загрузки, порождая конфликты пространства имен, как она идет.

FWIW, unserialize() дает те же результаты.

То, что я действительно хочу, - это загрузить эти объекты, не загружая все, что человек, который их сохранил, казалось, загрузился в то время, и это похоже на то, как он выглядит.

Update: здесь классы в объекте 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 пакета, все остальные из base или stats.

+3

Я предполагаю, что объекты, которые загружены в для классов, которые провоцируют этот каскад пакетов-загрузка ... Что такое класс '(х)' ?? –

+0

Я сейчас не работаю, но когда я осмотрел «класс», я не смог найти ничего интересного. Просто 'число и прочее. Я проверю снова утром. –

+0

'x' представляется сохраненной моделью (если имя файла релевантно). Как было создано 'x'? – mnel

ответ

2

Хорошо. Это не может быть полезным ответом (который потребует более подробной информации), но я думаю, что это, по крайней мере, ответ на вопрос «при каких обстоятельствах ..».

Прежде всего, я думаю, что это не относится к readRDS, но работает так же, как с любым save «D объектов, которые могут быть load» под ред.

Часть «При каких обстоятельствах»: когда сохраненный объект содержит среду, в которой есть среда пакета/пространства имен в качестве родителя. Или когда он содержит функцию, среда которой представляет собой среду пакета/пространства имен.

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 ... 
+0

Мне это нравится. 'parent.env' была частью, которую мне не хватало. В нашем случае я думаю, что есть масса вещей, которые мы должны очистить от родительских пространств имен . Благодаря. –

1

Один болезненными обходного пути я придумал, чтобы очистить объект любой среды он прикрепленный к нему, по противному Eval:

sanitizeEnvironments <- function(obj) { 
    tc <- textConnection(NULL, 'w') 
    dput(obj, tc) 
    source(textConnection(textConnectionValue(tc)))$value 
} 

Я могу взять старый объект, запустить его через этот функцию, затем выполните saveRDS(). Тогда загрузка нового объекта не приведет к удалению кусков по всему пространству имен.

+0

ugh. По крайней мере, он подтверждает, что загрузка пакета -извертывание вещей действительно скрывается в средах ... \ –

Смежные вопросы