web-dev-qa-db-ja.com

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

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

例:

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

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
84
Ryan Thompson

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

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

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

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

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

私は次を使用します:

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

次のようなものを試すこともできます:

# 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)
21
by0

保存された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]「argの値は7」

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

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

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

2
user2711915

.Rdataファイルに複数の変数が含まれる場合、特定の変数を選択できるように@ricardoからの回答を拡張しています(回答を編集するにはクレジットが低いため)。 .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')
0
SeanM

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

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