Bir nesneyi, bir R veri dosyasından belirlediğim bir değişken adına nasıl yükleyebilirim?


97

Bir değişkeni kullanarak bir R veri dosyasına savekaydettiğinizde, onu kaydeden oturumda sahip olduğu ad altında kaydedilir. Daha sonra başka bir oturumdan yüklemeye gittiğimde, yükleme betiğinin muhtemelen bilemeyeceği aynı adla yükleniyor. Bu ad, yükleme oturumunda aynı adı taşıyan mevcut bir değişkenin üzerine yazabilir. Bir nesneyi bir veri dosyasından belirtilen değişken adına, mevcut değişkenleri engelleme riski olmadan güvenli bir şekilde yüklemenin bir yolu var mı?

Misal:

Oturumu kaydetme:

x = 5
save(x, file="x.Rda")

Yükleme oturumu:

x = 7
load("x.Rda")
print(x) # This will print 5. Oops.

Nasıl çalışmasını istiyorum:

x = 7
y = load_object_from_file("x.Rda")
print(x) # should print 7
print(y) # should print 5

Yanıtlar:


93

Yalnızca tek bir nesneyi kaydediyorsanız, bir .Rdatadosya kullanmayın, bir .RDSdosya kullanın :

x <- 5
saveRDS(x, "x.rds")
y <- readRDS("x.rds")
all.equal(x, y)

2.13'te bunların artık deneysel olmadığını yansıtacak şekilde güncellendi.
hadley

Bu, .Rdata dosyaları gibi tam olarak desteklendikleri anlamına mı geliyor?
Ryan C. Thompson

Bunlar artık deneysel olmadığından, bunu kabul edilen yanıt olarak işaretliyorum. Bu benim kullandığım şey.
Ryan C. Thompson

Do saveRDSve readRDSbuna mukabil bir uygulama tarafından oluşturulan olanlar (aracılığıyla dahil kaydedin ve tüm nesnenin özelliklerini geri attr)? Ben yerine bu yaklaşımı kullanmaya çalıştı saveve loadbenim sorun için bir çözüm bulmaya çalışıyor. Ancak, yanlış bir şey yapmıyorsam durum böyle görünmüyor: stackoverflow.com/questions/23701195/… .
Aleksandr Blekh

38

Ben aşağıdakileri kullanıyorum:

loadRData <- function(fileName){
#loads an RData file, and returns it
    load(fileName)
    get(ls()[ls() != "fileName"])
}
d <- loadRData("~/blah/ricardo.RData")

1
Bu harika bir küçük işlev. Bir şeyleri yüklemeye çalışırken sorunlar yaşıyordum (sorunlara yol
açacağını

4
Buna benzer bir şey R üssüne ait
Repmat

1
AMAN TANRIM. Bu harika. Tam ihtiyacım olan şey! #loveit
Sander W. van der Laan

GET ifadesinin mantığını biraz daha açabilir misiniz? Hariç tutmak yerine neden FILENAME ile eşleşmiyor?
nnachefski

35

Yeni bir ortam oluşturabilir, .rda dosyasını bu ortama yükleyebilir ve nesneyi oradan alabilirsiniz. Ancak, bu bazı kısıtlamalar getirir: ya nesnenizin orijinal adını bilirsiniz ya da dosyada kayıtlı yalnızca bir nesne vardır.

Bu işlev, sağlanan bir .rda dosyasından yüklenen bir nesneyi döndürür. Dosyada birden fazla nesne varsa, rastgele bir nesne döndürülür.

load_obj <- function(f)
{
    env <- new.env()
    nm <- load(f, env)[1]
    env[[nm]]
}

3
new.envgerçekten gerekli? İşlev çağrısının kendisi geçici bir ortam sağlamıyor mu?
Ryan C. Thompson

@Ryan önerisine göre işlevi değiştirdiğinizde tüm ortamı (return (env)) veya return (environment ()) döndürebilirsiniz).
Wojciech Sobala

2
İşlev ortamını kullanırsanız, f'yi içerecek ve bir ebeveyni olacaktır. Muhtemelen istediğin değil
hadley

27

Ayrıca şöyle bir şey de deneyebilirsiniz:

# Load the data, and store the name of the loaded object in x
x = load('data.Rsave')
# Get the object by its name
y = get(x)
# Remove the old object since you've stored it in y 
rm(x)

4
Önemli olan, yükleme sırasında x değerinin bozulmasını önlemektir.
Ryan C. Thompson

2

Herhangi birinin bunu kaydedilmiş bir Rdata / RDS / Rda dosyası yerine düz bir kaynak dosyasıyla yapmak istemesi durumunda, çözüm @Hong Ooi tarafından sağlanana çok benzer.

load_obj <- function(fileName) {

  local_env = new.env()
  source(file = fileName, local = local_env)

  return(local_env[[names(local_env)[1]]])

}

my_loaded_obj = load_obj(fileName = "TestSourceFile.R")

my_loaded_obj(7)

Baskılar:

[1] "argümanın değeri 7"

Ve ayrı kaynak dosyasında TestSourceFile.R

myTestFunction = function(arg) {
  print(paste0("Value of arg is ", arg))
}

Yine, bu çözüm yalnızca tek bir dosya varsa işe yarar, daha fazla dosya varsa, o zaman yalnızca birini döndürür (muhtemelen ilki, ancak bu garanti edilmez).


1

.RdataDosyanın birden fazla değişken içermesi durumunda belirli bir değişkenin seçilmesine izin vermek için cevabı @ricardo'dan genişletiyorum (çünkü bir cevabı düzenlemek için kredilerim düşüktür). .RdataDosyada bulunan değişkenleri listeledikten sonra kullanıcı girdisini okumak için bazı satırlar ekler .

loadRData <- function(fileName) {
  #loads an RData file, and returns it
  load(fileName)
  print(ls())
  n <- readline(prompt="Which variable to load? \n")
  get(ls()[as.integer(n)])
}

select_var <- loadRData('Multiple_variables.Rdata')


1

Rdata dosyası tek nesne ile

assign('newname', get(load('~/oldname.Rdata')))

1
Bu, nesneyi eski isme yüklemeyecek ve ardından onu yeni isme de atamayacak mı? Mevcut bir değişkenin üzerine yazma olasılığından endişeleniyorsam bu yardımcı olmaz.
Ryan C. Thompson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.