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에서는 더 이상 실험적이지 않음을 반영하도록 업데이트되었습니다.
hadley 2011

.Rdata 파일처럼 완전히 지원된다는 의미입니까?
Ryan C. Thompson

이것들은 더 이상 실험적이지 않기 때문에 나는 이것을 받아 들인 대답으로 표시하고 있습니다. 이것이 제가 사용해온 것입니다.
Ryan C. Thompson

saveRDSreadRDS상응 응용 프로그램에 의해 만들어진 것들 (등을 통해 저장하고 모든 객체의 속성을 복원 attr)? save및 대신이 방법을 사용하여 load문제에 대한 해결 방법을 찾으려고했습니다. 그러나 내가 뭔가 잘못하지 않는 한, 그것은 사실이 아닌 것 같습니다 : stackoverflow.com/questions/23701195/… .
Aleksandr Blekh

37

다음을 사용합니다.

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

1
이것은 아주 작은 기능입니다. 에 (didnt가 궁핍 부하 일하려고 내가 문제에가는 것을 알고 바로 지구 환경에 넣어 함께 문제가되었습니다.
트레버 네덜에게

4
이와 같은 것은베이스 R에 속합니다
Repmat

1
OMG. 굉장합니다. 내가 필요한 것! #loveit
Sander W. van der Laan

GET 문의 논리를 확장 해 주시겠습니까? 제외하는 대신 FILENAME과 일치하지 않는 이유는 무엇입니까?
nnachefski

35

새 환경을 만들고 .rda 파일을 해당 환경으로로드 한 다음 거기에서 개체를 검색 할 수 있습니다. 그러나 이것은 몇 가지 제한을 부과합니다. 객체의 원래 이름이 무엇인지 알고 있거나 파일에 하나의 객체 만 저장되어 있습니다.

이 함수는 제공된 .rda 파일에서로드 된 객체를 반환합니다. 파일에 둘 이상의 객체가 있으면 임의의 객체가 반환됩니다.

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

3
new.env정말 필요? 함수 호출 자체가 임시 환경을 제공하지 않습니까?
Ryan C. Thompson

@Ryan 제안에 따라 함수를 수정하면 전체 환경 (return (env) 또는 return (environment ()))을 반환 할 수 있습니다.
Wojciech Sobala 2011

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 값을 방해하지 않는 것입니다.
Ryan C. Thompson

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] "arg 값은 7입니다."

그리고 별도의 소스 파일 TestSourceFile.R

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

다시 말하지만,이 솔루션은 정확히 하나의 파일이있는 경우에만 작동하고 더 많은 파일이 있으면 그중 하나를 반환합니다 (아마도 첫 번째 파일이지만 보장되지는 않음).


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')))

1
이렇게하면 개체가 이전 이름으로로드 된 다음 새 이름에도 할당되지 않습니까? 기존 변수를 덮어 쓸 가능성이 걱정되면 도움이되지 않습니다.
라이언 C. 톰슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.