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
単一のオブジェクトのみを保存する場合は、.Rdata
ファイルを使用せず、.RDS
ファイルを使用します。
x <- 5
saveRDS(x, "x.rds")
y <- readRDS("x.rds")
all.equal(x, y)
新しい環境を作成し、その環境に.rdaファイルをロードして、そこからオブジェクトを取得できます。ただし、これにはいくつかの制限があります。オブジェクトの元の名前を知っているか、ファイルに保存されているオブジェクトは1つだけです。
この関数は、指定された.rdaファイルからロードされたオブジェクトを返します。ファイルに複数のオブジェクトがある場合、任意のオブジェクトが返されます。
load_obj <- function(f)
{
env <- new.env()
nm <- load(f, env)[1]
env[[nm]]
}
私は次を使用します:
loadRData <- function(fileName){
#loads an RData file, and returns it
load(fileName)
get(ls()[ls() != "fileName"])
}
d <- loadRData("~/blah/ricardo.RData")
次のようなものを試すこともできます:
# 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)
保存された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つを返すだけです(おそらく最初のファイルですが、保証されません)。
.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')
1つのオブジェクトを含むRdataファイル
assign('newname', get(load('~/oldname.Rdata')))