Rデータファイルから指定した変数名にオブジェクトをロードするにはどうすればよいですか?


97

を使用してRデータファイルに変数を保存すると、変数はsave、それを保存したセッションで使用されていた名前で保存されます。後で別のセッションからロードするときに、同じ名前でロードされますが、ロードスクリプトではこれを認識できません。この名前は、ロードセッションで同じ名前の既存の変数を上書きする可能性があります。既存の変数を破壊するリスクなしに、データファイルから指定した変数名にオブジェクトを安全にロードする方法はありますか?

例:

セッションを保存しています:

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

ロードセッション:

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

どのように機能させるか:

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

回答:


93

単一のオブジェクトを保存するだけの場合は、.Rdataファイルを使用せず、ファイルを使用し.RDSます。

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

2.13では、これらは実験的なものではなくなったことを反映するように更新されました。
ハドリー2011

.Rdataファイルと同じように、完全にサポートされているということですか?
ライアンC.トンプソン

これらはもはや実験的なものではないので、これを受け入れられた回答としてマークします。これは私が使ってきたものです。
ライアンC.トンプソン

saveRDSreadRDS、それに対応し、アプリケーション(経由で作成されたものも含め、すべてのオブジェクトの属性を、保存と復元attr)?saveandの代わりにこのアプローチを使用loadして、問題の回避策を見つけようとしました。しかし、私が何か間違っているのでない限り、それはそうではないようです:stackoverflow.com/questions/23701195/…
Aleksandr Blekh 2014年

37

私は以下を使用します:

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

1
これは素晴らしい小さな機能です。。私はそれが問題に行っていた知っているように、単に地球環境にそれらを置くために(didntの場合に役立ち負荷のものにしようとして問題を抱えていた
トレバーNederlof

4
このようなものはベースRに属します
Repmat

1
ああ、神様。これは素晴らしいです。ちょうど私が必要なもの!#loveit
Sander W. van der Laan

GETステートメントのロジックを詳しく説明してもらえますか?除外せずにFILENAMEと一致させないのはなぜですか?
nnachefski 2017

35

新しい環境を作成し、.rdaファイルをその環境にロードして、そこからオブジェクトを取得できます。ただし、これにはいくつかの制限があります。オブジェクトの元の名前がわかっているか、ファイルに保存されているオブジェクトが1つだけです。

この関数は、指定された.rdaファイルからロードされたオブジェクトを返します。ファイルに複数のオブジェクトがある場合、任意のオブジェクトが返されます。

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

3
あるnew.env本当に必要?関数呼び出し自体は一時的な環境を提供しませんか?
ライアンC.トンプソン

環境全体を返すことができます(@Ryanの提案に従って関数を変更すると、return(env)またはreturn(environment()))。
Wojciech Sobala

2
関数環境を使用する場合、fが含まれ、親があります。おそらくあなたが望むものではないでしょう
ハドリー

27

次のようなことも試すことができます。

# 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
ポイントは、ロード時にxの値を壊さないようにすることです。
ライアンC.トンプソン

2

保存されたRdata / RDS / Rdaファイルではなくプレーンソースファイルを使用してこれを実行しようとしている場合、解決策は@Hong Ooiによって提供されるものと非常に似ています。

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)

プリント:

[1]「引数の値は7」

そして、別のソースファイルTestSourceFile.R

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

繰り返しますが、このソリューションは、ファイルが1つしかない場合にのみ機能し、ファイルが複数ある場合は、そのうちの1つを返すだけです(おそらく最初のファイルですが、保証はされません)。


1

@ricardoからの回答を拡張して、.Rdataファイルに複数の変数が含まれている場合に特定の変数を選択できるようにします(回答を編集するためのクレジットが少ないため)。.Rdataファイルに含まれる変数をリストした後、ユーザー入力を読み取るための行を追加します。

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

1つのオブジェクトを含むRdataファイル

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

1
これにより、オブジェクトが古い名前に読み込まれ、新しい名前にも割り当てられませんか?既存の変数を上書きする可能性を心配している場合、これは役に立ちません。
ライアンC.トンプソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.