Как создать обертку до load
, чтобы переименовать объекты, конфликтующие с существующим рабочим пространством. Fopr например
safeload<-function(file, env=parent.frame()) {
tmp<-new.env()
load.names <- load(file, tmp)
exist.names <- ls(envir=env)
new.names <- make.names(c(exist.names, load.names), unique=TRUE)[-seq_along(exist.names)]
Map(assign, new.names, mget(load.names, tmp), MoreArgs=list(envir=env))
attr(new.names, "orig.names) <- load.names
invisible(new.names)
}
Тогда, если вы пытаетесь
m1 <- matrix(1:4, ncol=2)
m2 <- matrix(5:8, ncol=2)
save(m1,m2, file="t1.RData")
m1 <- matrix(11:14, ncol=2)
m2 <- matrix(15:18, ncol=2)
save(m1,m2, file="t2.RData")
Вы увидите текущие значения m1
и m2
являются
m1
# [,1] [,2]
# [1,] 11 13
# [2,] 12 14
m2
# [,1] [,2]
# [1,] 15 17
# [2,] 16 18
тогда, если мы запустим
safeload("t1.RData")
это попытается перезагрузить m1
и m2, but since those exist, we use
make.name() to create unique names for those values. It renames the
m1 to
m1.1`. Итак, теперь у нас есть
m1
# [,1] [,2]
# [1,] 11 13
# [2,] 12 14
m1.1
# [,1] [,2]
# [1,] 1 3
# [2,] 2 4
Эта функция никогда не должна переписывать значения, она всегда добавляет что-то уникальное имя. Итак, вы продолжаете работать safeload
в том же файле RData, а затем будете создавать новые переменные. Функция будет невидимо возвращать окончательные имена только что загруженных объектов (с исходными именами из файла RData в качестве атрибута с именем «orig.names»)
Если вы хотите «объединить» эти два файла RData , что-то вроде
newds<-new.env()
safeload("t1.RData", newds)
safeload("t2.RData", newds)
save(list=ls(envir=newsd), envir=newds, file="t3.RData")
Таким образом, эти переменные никогда не будут загружены в глобальную среду.
[У вас есть что-нибудь?] (Http://whathaveyoutried.com) – Barranka
Барранка, да, я ищу в Интернете, но ничего интересного не придумали. – jpcgandre
Итак, по «набору данных» вы имеете в виду объекты R, которые были сохранены в файле RData с помощью 'save()'? И сейчас вы используете 'load()', но объекты объектов переписываются каждый раз? Вы хотите явно указать все объекты во время загрузки? Или вы просто хотите избежать столкновений имен? Используете ли вы только глобальную среду или вы загружаете объекты в настраиваемые среды? – MrFlick